Go语言认识

Go语言认识

  • 1. Go语言的设计背景
  • 2. Go语言的历程
  • 3. Go语言对比分析
  • 4. Go语言未来的发展规划
  • 5. 要不要选择Go

关注 go博客 直接了解第一手资料。
go文档 了解go的全貌。

1. Go语言的设计背景

Go语言(也称为Golang)是由Google开发的一种编程语言。它的设计背景源于对现有编程语言的不足之处的反思和对新兴需求的追求。以下是Go语言的设计背景的详细解释:

  1. 并发编程需求:随着计算机硬件的发展,多核处理器和分布式系统变得越来越普遍。传统的编程语言在处理并发编程时存在一些困难,如共享内存并发模型的复杂性和线程安全问题。Go语言通过引入轻量级的Goroutine和通道(Channel)机制,使并发编程变得更加简单和安全。

  2. 大规模软件开发:在大规模软件开发中,代码的可维护性和可读性非常重要。然而,一些传统的编程语言在这方面存在一些问题,如复杂的语法和过多的语言特性。Go语言通过简洁的语法和清晰的设计原则,鼓励编写简洁、可读性强的代码,以提高软件的可维护性。

  3. 快速编译和执行:在软件开发过程中,快速的编译和执行速度可以提高开发效率。一些编程语言在编译和执行速度方面存在一些问题,如编译时间长或执行效率低。Go语言通过优化编译器和运行时,以及采用静态链接的方式,实现了快速的编译和执行速度。

  4. 内存管理:传统的编程语言在内存管理方面存在一些问题,如手动内存管理容易出错,自动垃圾回收机制可能导致性能问题。Go语言引入了一种称为"垃圾回收器"的自动内存管理机制,可以在不牺牲性能的情况下自动回收不再使用的内存。

  5. 跨平台支持:在现代软件开发中,跨平台支持变得越来越重要。一些编程语言在不同平台上的兼容性和可移植性方面存在一些问题。Go语言通过提供跨平台的编译器和运行时环境,使得开发者可以轻松地在不同的操作系统和硬件平台上开发和部署应用程序。

  6. 开发者友好性:Go语言的设计目标之一是提供一种开发者友好的编程语言。它通过提供简洁的语法、清晰的错误信息和丰富的标准库,使得开发者可以更轻松地学习和使用该语言。

总结起来,Go语言的设计背景可以归结为对并发编程需求、大规模软件开发、快速编译和执行、内存管理、跨平台支持和开发者友好性的关注。这些设计原则使得Go语言成为一种简洁、高效、可靠和易于使用的编程语言。

  1. Go语言官方网站:https://golang.org/
  2. “The Go Programming Language”(Go语言官方书籍):https://golang.org/doc/
  3. “Go at Google: Language Design in the Service of Software Engineering”(关于Go语言设计的论文):https://talks.golang.org/2012/splash.article
  4. “Go: A Systems Programming Language”(关于Go语言设计的演讲视频):https://www.youtube.com/watch?v=rKnDgT73v8s

2. Go语言的历程

  • 2007年:Go语言的起源可以追溯到2007年。当时,Google的工程师们(包括Robert Griesemer、Rob Pike和Ken Thompson)开始思考如何设计一种新的编程语言,以解决一些现有编程语言的问题,并满足Google内部的需求。

  • 2009年:Go语言的首个公开版本(Go 1)于2009年11月发布。这个版本是一个实验性版本,用于收集反馈和改进语言设计。Go语言的设计目标是提供一种简洁、高效、可靠和易于使用的编程语言,适用于大规模软件开发和并发编程。

  • 2010年:Go语言的发展开始引起广泛关注。在2010年,Go语言的用户社区开始形成,许多开发者开始尝试使用Go语言进行项目开发,并提供了一些开源项目和库。

  • 2012年:Go语言的发展进入了一个新的阶段。在2012年3月,Go语言的第一个稳定版本(Go 1)发布。这个版本的发布标志着Go语言的正式进入生产环境,并承诺向后兼容性。

  • 2014年:Go语言的发展继续迅速。在2014年,Go语言的第一个大版本升级(Go 1.4)发布。这个版本引入了一些重要的改进,如增强的垃圾回收器、更好的并发性能和更好的工具链。

  • 2016年:Go语言的发展持续推进。在2016年,Go语言的第二个大版本升级(Go 1.7)发布。这个版本引入了一些新特性,如上下文(Context)包、并发安全的Map类型和更好的编译器优化。

  • 2018年:Go语言的发展继续取得重要进展。在2018年,Go语言的第三个大版本升级(Go 1.11)发布。这个版本引入了一些重要的改进,如模块化支持、WebAssembly支持和更好的性能优化。

  • 2020年:Go语言的发展仍在继续。在2020年,Go语言的第四个大版本升级(Go 1.15)发布。这个版本引入了一些新特性,如更快的编译速度、更好的垃圾回收和更好的错误处理。

  • 2022年:Go语言支持了泛型。在2022年,Go 1.18 发布,让Go语言支持了泛型,在开发通用性的逻辑时,不在使用interface{}万能类型来传参,更好的处理通用逻辑中的类型。

Go语言的发展历程可以追溯到其诞生的初期,经历了多个版本的迭代和改进。随着时间的推移,Go语言在开发者社区中获得了广泛的认可和使用,并在许多领域得到了应用,包括网络服务、分布式系统、云计算和人工智能等。

比较有意思的是,如果你开发过Java,那么你一定知道NPE异常,在2023年8月发布的Go 1.21.0 中,新增了一个错误*runtime.PanicNilError,可以认为这是Go版本的NPE。(大道同归~)

“A brief history of Go”(关于Go语言历史的官方博客文章):https://blog.golang.org/10years

go 发布历史 查看全部版本,以及每个版本go的特性。

3. Go语言对比分析

  1. 性能:
    Go语言:Go语言以高性能而闻名,其编译器和运行时系统的设计使其能够有效地利用多核处理器。它具有轻量级线程(goroutine)和通信机制(channel),使并发编程变得简单而高效。
    Java:Java的性能通常比Go语言稍低,但它具有强大的即时编译器和优化技术,可以在运行时进行性能优化。
    C和C++:C和C++是编译型语言,执行效率非常高。它们可以直接操作内存,提供了底层控制的能力,适合开发对性能要求较高的应用程序。

  2. 并发支持:
    Go语言:Go语言原生支持轻量级线程(goroutine)和通信机制(channel),使得并发编程变得简单而高效。
    Java:Java通过线程和锁机制来支持并发编程,但相对于Go语言的goroutine和channel,Java的并发编程模型更为复杂。
    Python:Python的并发支持相对较弱,但通过使用第三方库(如concurrent.futures和asyncio)可以实现并发编程。
    C和C++:C和C++本身没有原生的并发支持,但可以使用线程库(如pthread)来实现并发编程。
    JavaScript:JavaScript通过事件循环和异步编程模型来支持并发操作,使得在浏览器中处理大量并发请求变得容易。

  3. 生态系统和库支持:
    Go语言:尽管Go语言的生态系统相对较年轻,但它拥有丰富的标准库和活跃的开源社区。许多知名的项目和库(如Docker、Kubernetes和gin)都是使用Go语言开发的。
    Java:Java拥有庞大而成熟的生态系统,具有丰富的类库和框架,适用于各种应用场景。一些知名的Java框架包括Spring、Hibernate和Apache Struts。
    Python:Python拥有强大的第三方库和框架,可以快速实现各种功能。一些知名的Python库和框架包括NumPy、Django和Flask。
    C和C++:C和C++拥有丰富的类库和工具,可以用于系统级编程、嵌入式开发和游戏开发等领域。
    JavaScript:JavaScript在前端开发中具有广泛的应用,拥有丰富的类库和框架,如React、Angular和Vue.js。
    PHP:PHP在网页开发领域具有广泛的应用,拥有许多成熟的框架和类库,如Laravel和Symfony。

  4. 学习曲线:
    Go语言:Go语言的语法简洁明了,学习曲线相对较低,适合初学者入门。
    Java:Java是一种面向对象的语言,学习曲线较陡峭,需要掌握面向对象的概念和复杂的语法规则。
    Python:Python的语法简单易读,学习曲线相对较低,适合初学者入门。
    C和C++:C和C++的语法相对较复杂,需要掌握指针、内存管理等底层概念,学习曲线较陡峭。
    JavaScript:JavaScript的语法相对较简单,但在处理异步编程和浏览器API时可能会有一些复杂性。
    PHP:PHP的语法相对较简单,学习曲线较低,适合快速入门。

Go语言比Java快,比c/c++简单,不需要直接管理内存,比Python更容易实现大型项目,只有25个关键字,更容易上手等等的优点;
但是也存在不足,比如没有Java那么强大的生态,没有c/c++那么深的基础,没有php和js以及Python的动态特性,糟糕的异常处理等等。
没有最好的语言,只有合适不合适。

4. Go语言未来的发展规划

提高性能和并发能力:
Go语言以其出色的性能和并发能力而闻名。未来,Go语言的发展将继续致力于提高性能和并发处理能力,以满足不断增长的需求。这包括改进编译器、优化运行时、提高垃圾回收机制等方面的工作。
而且事实上每一次Go版本的发布,都伴随着编译和运行时的性能优化,或者是内存回收的优化。

扩展应用领域:
目前,Go语言已经在许多领域得到了广泛应用,包括网络服务、云计算、容器技术等。未来,Go语言将继续扩展其应用领域,进一步深入到人工智能、大数据、区块链等新兴领域。
(我个人认为云原生可能是一个方向)

生态系统的发展:
Go语言拥有一个活跃的开源社区,其中包括许多优秀的第三方库和框架。未来,Go语言的生态系统将继续发展壮大,为开发者提供更多的工具和资源。这将有助于提高开发效率,加速应用的开发和部署。
相比较Java,Go的生态还是差距非常大,而且基本上Go的第三方库都是来自github,可能会出现第三方库的维护问题,水平参差不齐问题等等。相较于Java,Go的生态缺少一些权威支持的第三方库,比如Java里面的apache,spring,等等现象级的框架。

支持更多平台和架构:
目前,Go语言已经支持多个平台和架构,包括Windows、Linux、macOS等。
在当下环境中,跨平台可以算是每一种编程语言的基本能力了,从Java的Write Once, Run anywhere. 甚至现在不仅仅包括三大主流系统:windows,mac,linux,还包含一些硬件嵌入式等系统的支持。

提供更好的工具和开发体验:
Go语言注重简洁、易用和高效的设计理念。未来,Go语言将继续改进工具链,提供更好的开发体验,包括更友好的IDE集成、更强大的调试工具等。
Go开发团队在最新的2年一次的开发者调查中,已经初步确定在24年中,将会把工具链和错误堆栈等作为将会解决的问题了。期待~
Go23年h2开发者调查报告-工具链错误

相较于Python的版本不兼容问题,比如Python2和Python3虽然大致上相同,但是仍然存在相当数量的SDK不兼容问题,比如最常用来举例的print "helloWorld"print("helloWorld")
SDK版本不兼容不仅仅只有Python,Scala也是其中之一,Scala2和Scala3就是不兼容的,比如spark发行物中,就有4种(也许现在不是了),spark2&&spark3,spark2,spark3,source code 。
SDK版本不兼容就会出现同样的代码逻辑需要开发两次,当然更多的是做适配,而不是核心逻辑也写两份,除此之外,还会出现同样的环境针对同一种语言需要依赖两种SDK,在开发的时候时候需要不断的切换SDK的版本。
幸运的是,目前为止,仅仅是目前为止,在Go的开发计划中,Go 2和Go 1 是高度兼容的,但是Go 的开发团队也没有做出完全保证,说Go 2和Go 1完全100%兼容。
Go 2计划

在这里插入图片描述

5. 要不要选择Go

语言只是一种工具而已,实现一个功能,只要不是特定领域的特定功能,我相信绝大部分编程语言都能实现。那么,为什么选择Go呢,看了看网上的资料,各有各的说法,不过确实有些说法很中肯。
比如Go语言背靠Google,其发展稳定性能得到一定的保障,不会出现烂尾的风险,当然现在也不能绝对。只是就目前来说,随着大环境的整体变差,降本增效是大主流,相比Java的大资源消耗,Go对于硬件资源的要求确实基本上做到了c/c++的程度,毕竟运行一个jvm就需要很大的资源。
有人认为Go是站在前人的肩膀上的一门语言,毕竟Go语言核心开发者,是c,c++,jvm,操作系统的作者或者参与者,重新设计一门全新的语言,那么一定会将之前成功的经验发扬光大,失败的问题提前避免。
比如相比c/c++,Go实现了自动内存回收,大大的解决了c/c++的内存管理难题。当然所谓的难题也只是对语言的深度不够导致的。
站在云原生和低资源消耗这两个角度,我认为学习Go有一定的必要,但还是看工作的需要和个人未来的发展规划。

没有哪一种语言是永恒的,但是其思想可以长存。 ~共勉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

59.说一下 spring 的事务隔离?

spring 的事务隔离有什么作用? 用来解决并发事务所产生一些问题,并发会产生什么问题? 1.脏读2.不可重复度3.幻影读事务隔离的概念 通过设置隔离级别可解决在并发过程中产生的那些问题分别举例说明 1.脏读 上述图表示:一个事务,读取了另一个事务中没有提交的数据,会在…

LabVIEW高效振动时效处理系统

概述:介绍了一个利用LabVIEW开发的振动时效处理系统,有效降低加工工件的内部残余应力,提升其质量和寿命。 项目背景 工业加工中的工件常存在残余应力问题,这直接影响工件的质量和寿命。虽然热时效和自然时效法被广泛应用于降低残余…

数据结构学习 jz45 把数组排成最小的数

关键词:贪心 排序 快速排序 题目:破解闯关密码 思路: 快排自己制定快排规则 开辟一个vector存string,自己制定排序规则,然后用快排比较string大小。 排序规则: sort(strs.begin(),strs.end(),[](string…

供应链管理是什么?专业就业前景如何?

什么是供应链管理 供应链(Supply Chain),也被称为价值链或需求链(Demand Chain),包括顾客、供应商、过程、产品以及对产品和服务有影响的各种资源。供应链强调的是公司之间的过程与关系。 《中华人民共和国…

置位复位寄存器的某一位(多工位多工站渗透线控制应用)

这里的置位复位特定寄存器位功能块可以应用在渗透线控制应用上,我们可以根据小车当前所在位置,对相关工作槽里的标志位进行置位复位等操作(某个槽有产品,某个槽没有产品等)。 下面我们看下对应的控制要求 1、置位复位特定的位 2、置位复位寄存器中的某一位 3、置位bit8 4…

vue中使用mpegts.js播放flv的直播视频流

第一步&#xff1a;引入mpegts.js npm install --save mpegts.js 第二步&#xff1a;在vue文件中引入mpegts.js的依赖 第三步&#xff1a;编写展示视频的盒子 我这里是使用循环遍历的方式创建video标签&#xff0c;这样方便后面随机展示视频使用 <template><div>&l…

k8s存储卷-动态PV

pv和PVC&#xff0c;存储卷&#xff1a; 存储卷&#xff1a; EmptyDir&#xff1a;容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失&#xff0c;不能做数据持久化 HostPath&#xff1a;持久化存储数据&#xff0c;可以和节点上目录做挂载&#xff0c;pod被销毁…

屏蔽/非屏蔽线、屏蔽/非屏蔽端口介绍

一、双绞线 双绞线&#xff08;twisted pair&#xff0c;TP&#xff09;是一种综合布线工程中最常用的传输介质&#xff0c;是由两根具有绝缘保护层的铜导线组成的。把两根绝缘的铜导线按一定密度互相绞在一起&#xff0c;每一根导线在传输中辐射出来的电波会被另一根线上发出的…

vivado 使用约束、添加和创建约束文件

使用约束 Vivado IDE支持Xilinx设计约束&#xff08;XDC&#xff09;和Synopsys设计约束&#xff08;SDC&#xff09;文件格式。SDC格式用于定时约束&#xff0c;而XDC格式用于两者时间和物理约束。约束可以包括位置、时间和I/O限制。您可以在设计流程的各个步骤中创建约束&am…

1 python计算机基础

计算机基础和环境搭建 1 计算机基础和环境搭建1.计算机基础1.1 基本概念1.2 编程语言1.3 编译器/解释器 2.学习编程的本质3.Python的介绍3.1 语言的分类3.2 Python3.3 Python的解释器种类&#xff08;了解&#xff09;3.4 CPython解释器的版本 4.环境搭建4.1 安装Python解释器4…

详解SpringCloud微服务技术栈:Nacos配置管理

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;Nacos服务搭建及服务分级存储模型 &#x1f4da;订阅专栏&#xff1a;微服务技术全家桶…

LaTeX系列1——主结构

初学&#xff0c;可交流&#xff0c;轻喷 \documentclass{book} \begin{document} \title{Book Title} \author{Author Name} \date{\today} \maketitle\chapter{Introduction} This is the introduction chapter of the book.\section{First Section} The first section of t…

学位论文中常用的参考文献格式

撰写学位论文中&#xff0c;要确保文献列表中列出的参考文献格式正确&#xff0c;为此这篇文章给出常用的参考文献格式。 目录 目录 一、学位论文中常用的文献类型&#xff1a; 1.1学位论文中常用的文献类型&#xff1a; 1.2作者名字的书写格式&#xff1a; 1.3特殊符号// …

JRTP实时音视频传输(1)-必做的环境搭建与demo测试

1.需求 1&#xff09;支持协议自动切换。在网络优的情况下使用TCP、网络差的情况下使用UDP&#xff0c;满足实时音视频传输需求&#xff0c; 2&#xff09;支持RTCP &#xff0c;流量控制&#xff0c;阻塞控制等。需要能支持RTCP&#xff0c;这样便能在这个基础上&#xff0c;…

人工智能 | 生成式 AI 如何重塑开发流程和开发工具?

生成式 AI 如何重塑开发流程和开发工具&#xff1f; 生成式人工智能&#xff08;Generative Artificial Intelligence&#xff0c;GAI&#xff09;是一种基于大规模数据训练学习&#xff0c;从而生成新的原创内容的人工智能。生成式人工智能可以生成各种形式的数据&#xff0c…

Kafka-生产者

Kafka在实际应用中&#xff0c;经常被用作高性能、可扩展的消息中间件。 Kafka自定义了一套网络协议&#xff0c;只要遵守这套协议的格式&#xff0c;就可以向Kafka发送消息&#xff0c;也可以从Kafka中拉取消息。 在实践生产过程中&#xff0c;一套API封装良好、灵活易用的客…

CC工具箱使用指南:【添加图层名和路径到字段】

一、简介 如题&#xff0c;这个工具的目的就是将图层的名称和路径添加到字段值中。 有时候图层的名称和路径也是重要的信息&#xff0c;需要参与到字段的计算或是分析中&#xff0c;但是Arcgis Pro中没有一个方便的方法可以将其写入字段值&#xff0c;因此&#xff0c;就做了…

机器学习周刊第六期:哈佛大学机器学习课、Chatbot Ul 2.0 、LangChain v0.1.0、Mixtral 8x7B

— date: 2024/01/08 — 吴恩达和Langchain合作开发了JavaScript 生成式 AI 短期课程&#xff1a;《使用 LangChain.js 构建 LLM 应用程序》 大家好&#xff0c;欢迎收看第六期机器学习周刊 本期介绍10个内容&#xff0c;涉及Python、机器学习、大模型等,目录如下&#xff…

特征工程-特征处理(三)

特征处理 连续型变量处理&#xff08;二&#xff09; 多特征 降维 PCA PCA是一种常见的数据分析方式&#xff0c;通过数据分解&#xff0c;将高维数据降低为低维数据&#xff0c;同时最大程度保持数据中保存的信息。 from sklearn.decomposition import PCA A np.array([[84…

表单生成器基于(form-create-designer+ant design vue)

效果展示 1.源码地址&#xff1a; 前端&#xff1a;https://gitee.com/houshixin/form-design-ui 后端&#xff1a;https://gitee.com/houshixin/form-design-web 2.单独使用前端的时候就把请前后台的接口注释就可以 3.都启动的话&#xff1a; 1&#xff09;.先导入数据库 2.表…