Go 语言十年而立,Go2 蓄势待发


Go语言十年而立,Go2蓄势待发

  

作者|柴树山

主编|郭焱

在21世纪的第一个十年,计算机开始在中国大陆流行,高校的计算机相关专业逐渐流行起来。那时,学校主要学习C/C ++和Java语言,其中大部分语言都是在20世纪90年代或更早的时候诞生的。因此,这些计算机领域的理论知识或编程语言似乎是上帝创世纪作为计算机的产物。相关领域的学生只能期待这些结果。

Go语言诞生于21世纪,当时新一波的工业编程语言即将爆发。编译器语言Rust,Kotlin和Switft诞生于2010年左右。前端诞生了Dart和Type等工业语言。最新的V语言甚至试图在Go和Rust的肩膀上进行创新。而这些变化都发生在我们身上,让中国计算机爱好者在学习过程中见证历史的发展,甚至有机会参与其中。

2019年是CSDN成立20周年和Go语言十周年。感谢CSDN平台提供的机会,我可以在过去十年中与您分享一些有关中国围棋社区的故事。

Go语言诞生了

Go语言最初由Google的Robert Griesemer,KenThompson和RobPike于2007年发明。其设计的最初功能来自于对超复杂C ++ 11特性的宣传报告的蔑视,最终目标是设计C语言在网络和多核时代。到2008年中期,大部分语言的功能设计已经完成,并开始实现编译和运行,大约在同一时间RussCox作为主要开发人员加入。到2009年,Go语言逐渐稳定下来。同年9月,Go语言正式发布并开源。

以上是《Go语言高级编程》第一章的第一部分。当Go语言只是开源时,每个人都对其编译速度印象深刻:二级编译已经完成,它可以像脚本一样编译和执行。同时,Go语言的隐式接口使编译语言具有duck类型的能力。作者还第一次意识到C ++的原始虚拟表vtab也可以动态生成!至于每个人最愿意讨论的不是特征,它不是Go新发明的基石。早在20世纪80年代和90年代,许多语言开始尝试将CSP理论引入编程语言(RobPike是一个坚定的实践者)。 )。然而,早期CSP实践的语言没有进入主流开发领域,这导致了这种并发模型的陌生。

除了语言功能的创新之外,Go还附带了一套编译和构建工具,而小型标准库则带有完整的Web编程基础结构。我们可以轻松编写支持Go语言的高并发访问的Web服务。

作为互联网时代的C语言,Go语言终于进入了主流编程领域。

去语言十年推进

Go自2007年开始设计,并于十年前于2009年正式宣布。 Go语言已经稳定了十年,而且在2019年仍然可以编译和运行Go1.0代码而不需要修改。但是在保持语言稳定性的同时,Go语言逐渐巩固了基础,并且已经接近完美的极限十年。让我们来看看过去十年Go语言的变化。

界面更改

第一个是查看界面中的更改。第一次是2009年刚刚开源的时候,这个时候可以说是Go语言的古老时代。 Go语言主页如下:

那个时代的Gophers使用hg工具下载代码(而不是Git),Go代码托管在GoogleCode(而不是GitHub)上。随着代码的发展,hg已逐渐淡出Gopher的愿景,而GoogleCode网站已经关闭,Go1之前古代的Go代码已经开始慢慢衰退。

家庭中心是Go语言的最初口号:Go是一种富有表现力的并发编程语言,而且很简单。与此同时,我举了一个“你好,世界”的例子(注意这里的“世界”是日语)。

然后右上角是初学者的天堂:第一个是安装环境,然后是早期的三天教程,第三个是使用标准库。右上角的图片是RussCox的视频,仍应在Youtube上找到。

左上角是Go的经典文档。此外,常见问题解答,语言规范和内存模型是非常重要的核心温度。左下角还有文档链接,例如cmd,子页面的内容应保持不变。

然后在2012年,Go1的第一个正式版本发布了,语言,标准库和godoc在Go1之前得到了广泛的改进。 Go1样式页面效果如下:

当新页面刚刚出现时,有一种明亮的眼睛感觉。这是具有最长时间的页面布局。但不仅是作者,甚至是Go语言官员也慢慢厌倦了中文页面。因此,从2018年开始,Go语言开始了新的标识和网站重新设计工作。

以下是新的Go语言徽标:

2019年是Go语言发展的极其重要的一年。 Go1.13将于今年8月发布,这个版本将正式重启Go语言语法的演变并向Go2迈进。在Go1.13正式发布之前,新网站已于7月推出:

头上的按钮式菜单已经变成了平铺的风格,看起来更高。同时,页面的颜色已经过调整,以保持与新Logo相同的颜色。页面布局也已调整,下载的左右列已经交换。与此同时,仓鼠的头部位于一侧,据估计颈椎病复发。

一般来说,Go的官方网站经历了三个阶段:Go1,Go1(1.0~1.10),Go1(或Go2),并对应3种风格。新的布局可能是未来十年Go2的主页。

语法上的变化

尽管Go语言诞生于2009年,但Go1的第一个正式版本于2012年发布。事实上,在Go1诞生之前,Go语言足够稳定。国内的齐牛云在Go1之前开始转向Go语言开发。它是中国第一家采用Go语言的互联网公司。 Go1的目标是梳理标准库的语法和黑暗角落,为未来10年奠定坚实的基础。

从目前的结果来看,Go1无疑是一项伟大的成就。 Go1时代的代码仍然可以使用最新的Go语言工具进行编译而无需修改(不包括CGO或汇编语言部分,因为这些扩展工具不在Go1的承诺范围内)。但是,在Go1之后仍然有一些语法更新。在Go1.10之前,Go1时代语法和标准库部分有三个主要变化:

第一个主要的语法变化是将容量控制添加到2012年发布的Go1.2中的切片语法,这将防止不同的切片意外地与具有相同底层数组的其他切片的内存交叉。

第二个主要变化是在2016年发布的Go1.7标准库中引入了上下文包。上下文包是Go语言的Go实现,Go的并发编程实践简化了多个Goroutine和之间的数据,超时和退出。请求域以处理单个请求。上下文包启动后,它很快被社区吸收。例如,gRPC和许多Web框架通过上下文控制Goroutine的生命周期。

第三个主要的语法变化是2017年发布的Go1.9,它引入了类型别名的特征:typeT1=T2。类型别名T1由T2通过=符号定义,其中T1和T2完全相同。引入类型别名的原因是Go1.7将上下文扩展库移动到标准库所引起的问题得以解决。由于context.Context类型分别在标准库和扩展库中定义,因此不同包中的类型不兼容。许多开源库(如gRPC)在原始扩展库中使用了context.Context类型,这导致它与Go1.7标准库中的context.Context类型不兼容。这个问题最终通过类型别名来解决:扩展库中的context.Context类型是标准库中context.Context的别名类型,从而实现了与标准库的兼容性。

语法细节也有一些变化,例如Go1.4增强for循环语法和Go1.8版本,以对具有相同内存布局的结构施加约束。读者可以根据新的需求查看相关发布日志的文档。

运行时更改

运行时部分的最大变化是动态堆栈部分。在Go1.2之前,Go语言使用分段堆栈实现了堆栈的动态缩放。但是,分段动态堆栈存在性能问题,因为堆栈内存不连续,这将导致CPU缓存命中率下降,从而导致热点函数调用性能受到影响。因此,从Go1.3开始,应该有一个连续的动态堆栈。当堆栈移动时,连续动态堆栈部分地减轻了CPU堆栈上变量地址的变化。这直接带来了CGO编程,Go语言内存对象无法直接传递给C语言空间,因此Go语言官方为CGO问题开发了一个复杂的内存使用规范。

一般来说,如何实现动态堆栈是一个如何选择的问题,因为没有银弹,鱼和熊掌不能兼得,目前的选择是首先要保证纯Go程序的性能。

GC性能改进

Go语言是一种具有自动垃圾收集(GarbageCollection)的语言,称为GC(注意这是大写的GC,小写的gc代表Go语言编译器)。自Go诞生以来,GC的回收性能成为人们关注的热门话题。

Go语言可以支持GC功能的原因是Go语言中的每个变量都具有完整的元信息,并且元信息可以轻松跟踪所有指针的声明周期。在Go1.4之前,GC使用STW以回收内存的方式阻止世界。暂停通常是几秒甚至几十秒。因此,早期社区有很多关于如何规避或减少GC操作的技巧。

第一次GC性能变化发生在Go1.5期间。目前,Go语言运行时和工具链都已经从C语言实现到Go语言,这有助于重构和优化GC代码。 Go1.5第一次切换到并行和增量方式来回收内存,这将GC缩短到几百毫秒。以下图片是官方网站“GoGC: LatencyProblemSolved”中提供的数据:

Go1.5并发和增量改进是显而易见的,但最重要的是为未来的改进奠定基础。在Go1.5之后的Go1.6版本中,GC性能终于开始提高:从Go1.6.0暂停时间到数十毫秒,Go1.6.3减少到不到10毫秒。Go1.6的结果在Go1.8的官方日志中得到了证实:Go的GC通常小于100毫秒,甚至不到10毫秒!

当然,Go的GC优化步骤不会停止,但是重新创建Go1.5和Go1.6的令人兴奋的结果更难以估计。在Go1.8之后的几个版本中,官方发布日志很少见到量化的GC性能改进数据。

去语言引导过程

据说Go语言最初是基于Thompson的C语言编译的,初始输出是C语言代码(在它发布之前)。在Go1.4的开源之前,Go语言编译器和运行时是用C语言实现的。这样你就可以在早期用C语言实现Go语言功能了!由于强烈依赖C语言工具链,Go1.4之前的Go语言完全无法启动。

从Go1.4开始,Go语言运行时在Go中实现。具体实现方法是Go团队的RSC首先为Go代码转换工具实现简化的C代码。该工具主要用于将以前C语言的Go语言运行时转换为Go代码。因为它是自动转换的代码,所以您可以获得更可靠的Go代码。在将运行时转换为Go实现之后,第一个好处是GC确切地知道每个内存指针的状态(因为Go变量具有详细的类型信息),这也提供了Go1.5重写GC。运行时基础。

然后转到Go1.5并将编译器转换为Go实现。但转换为代码性能有一定的下降。许多程序的编译时间甚至慢到几十秒。在此期间,Internet上存在很多问题,编译Go1.5的速度很慢。 Go1.5使用Go语言编写编译器,并对工具链和目标代码进行了大量的重构工作。在Go1.5之后,交叉编译变得非常简单,只要GOOS=linuxGOARCH=amd64gobuild命令可以从任何Go语言环境生成Linux/amd64对象代码。

Go语言编译器是否有后门?如果后门编译器编译的Go程序有后门,是否有后门?后门编译器编译的Go编译器程序是否有后门?

尝试失败

Go语言开发过程并非都是成功案例,但也有一些失败的尝试。失败是成功的母亲。尽管这些尝试最终都失败了,但试验过程中积累的经验为新的方向提供了动力。

因为Go语言常量只支持几种类型,例如numeric和string,所以早期社区一直在调用切片的只读类型。为此,rsc首先在开发分支中实验性地实现了此功能,但在随后的实践中,它发现了许多与Go编程功能冲突的问题,因此在短暂尝试后放弃了只读切片的特性。当然,初始化后无法修改的变量特性仍然是每个人都期望的特征(类似于其他语言的最终特征),并希望在未来的Go2中有一些改进。

另一种尝试是早期基于供应商的版本管理。供应商和内部功能首次在Go1.5中引入,供应商用于打包外部第三方软件包,内部用户保护内部软件包。后来,供应商被开源社区的各种版本管理工具滥用,导致Go语言代码出现了一些无法构建的奇怪问题。滥用供应商导致供应商嵌套问题,这类似于nodejs社区中node_modules目录的嵌套。嵌套的供应商最终将出现在同一个包的不同版本中。这最后一根稻草最终打败了供应商机制,使官方Go语言团队从头开发了模块功能,彻底解决了版本管理问题。当Go1.13模块化正确时,GOPATH和供应商机制将被完全消除。

Go语言是一个开源项目,所有导入的包都必须有源代码。一些人声称是商业用户,称Go支持导入二进制包以最大限度地保护商业代码。为了满足社区的需求,Go1.7增加了导入二进制包的功能。但更具戏剧性的是,Go语言支持二进制包导入,并且没有多少人使用它,即使最初调用二进制包的人也没有使用(许多社区声音可能无法反映实际需求)。对于没有人使用的二进制包功能,Go语言团队需要付出相当大的努力来维护代码。为了减少这种不必要的功能,Go1.13将完全关闭二进制包的功能并解决新灯的实际需求。当然,Go语言已经支持生成静态库,共享库和插件的能力,并且它还可以通过这些机制保护代码。

可能会有一些失败的尝试,例如最近实现的try内置函数,以简化Go的父亲之一Robert Griesemer的错误处理,但被拒绝了。失败的尝试是一个好兆头,表明Go语言仍然在一些新兴领域。 Go语言仍然有效。

Go2发展方向

Go语言最初是一种简短而简洁的语言。经过多年的发展,Go1已接近稳定极限。在官方网站的谈话页面上查看报告的数量可以发现2015年之前各种报告的高峰期,从2016年到2017年共享的数量已经开始急剧下降,自2018年以来没有包含新的报告,是因为Go1语言的功能已被多次说过。第一波Go语言爱好者也是如此。 Go没有新的功能可以挖掘和学习,或者它不够酷。我们认为官方的Go语言团队感觉就像这样,所以我们在2018年首先开始解决模块化问题,然后开始正式讨论Go2的新特性,并重新开始Go1.13语言的演变。

模块化与构建管理有关。在Go语言的开头,它实际上是用Makefile目标构建的。然后gobuild命令的官方构建提供零配置文件构造,这极大地简化了构建过程。然后是goget命令,支持从Internet自动下载hg或git存储库代码进行构建,同时引入GOPATH环境变量以防止非标准库代码。从那时起,第一波版本管理工具也开始出现,通过动态调整GOPATH来导入特定版本的代码。然后,各种开源仿制和克隆版本管理工具如雨后春笋般涌现,基本上模仿了godeps的设计理念,基于GOPATH和后来的供应商来管理依赖包的版本,最终导致了对供应商的过度滥用(The上一篇文章中已经提到过供应商滥用问题。最后,在2018年,RSC亲自发明了基于最小化版本依赖性算法的版本管理功能。模块化功能是从Go1.11引入的,将在Go1.13中正式修正。在此之后,GOAPATH将完全退出历史舞台。

由于rsc的工作直接判断了开源社区各种版本管理工具的死亡,它也导致了官方Go语言团队与开源社区之间的许多冲突和矛盾。在这种情况下,Go语言的开发并不是完全开源的。 Go语言的开源仅限于提交问题或修改BUG。真正的语言设计始终是教会长老会教会的典范。作者认为这是开源的最佳方式。许多开源社区的例子也说明了独裁者的作用,而退伍军人就是这个角色。

在Go1.13中,除了模块化性质之外,还有许多语法上的改进:十六进制浮点数,大数字可以用下划线分隔,二进制和八进制面额常量等等。但是Go1.13在错误标准库方面也有了重大改进。错误库添加了三个函数,Is/As/Unwrap,它们将用于支持错误重新打包和识别处理,为Go2中的新错误处理改进做准备。随后的改进方向是错误处理的控制流程。已经提出了使用try/check关键字和try内置函数改进错误处理过程的先前提议。目前尚未确定任何解决方案。

Go2最令人期待的功能是泛型。从Go语言开始,官方显然已经拒绝了仿制药,并于2018年开始公开讨论仿制药,让通用粉丝看到了希望。许多人,包括早期的Go官员,都会说使用接口来模拟泛型实际上是一个借口。泛型的最大问题不是性能,而只有泛型可以为通用容器或算法提供类型安全的接口。例如,Add(a,bT)T泛型函数无法通过接口实现返回值类型的检查。如果Go语言支持泛型,然后结合Go汇编语言支持的AVX512指令,您可以预期Go语言将在CPU密集型字段中占有一席之地,甚至可以实现纯Go语言机器学习算法图书馆将来会出现。

最后要注意的是WebAssembly平台的Go语言支持。根据Ending定律:可以编译成WebAssembly的所有东西最终都会被编译成WebAssembly。 2018年,FabriceBellard将Windows 2000操作系统迁移到基于WebAssembly技术的浏览器环境。 WebAssemblySystemInterface技术出现在2019年,这可能是一个更轻量级的Docker替代品。 Go语言还有TinyGo的变体版本,目标是在受限环境(如WebAssembly或其他微控制器)中更好地运行Go程序。

去中国语言

回想一下,Go语言的第一个例子就是它发布时,它被打印成'Hello,World'。不幸的是,这里的“世界”不是中国人的“你好,世界”,而是日本人的“你好,世界”。日语仍然以汉字的转换为基础,这是整个中国世界的悲哀!

幸运的是,中国程序员更强大。目前,中国不仅是世界上关注度最高的国家,也是排名第二的国家。根据谷歌趋势数据,Go语言占全球在中国90%以上的关注度:

不仅是Go用户,而且中国的Gopher对Go的贡献也落后于美国。其中,魏京光在2010年深入参与Go语言开发,将Go语言移植到Windows系统并实现CGO支持。之后,来自中国的Minux实现了iOS等许多平台的移植,并正式加入了Go语言开发团队。目前,Go语言的最高贡献者是来自天津的Shi Bin(benshi001)。他的工作主要集中在编辑的优化上,在全球Go语言贡献者中排名第39位。

最早的Go语言中国爱好者通过谷歌讨论组golang-china讨论,讨论组将继续发表新文章。然后,在2012年左右,由于诸多因素,国内讨论开始关注QQ群(作者在2010年在中国建立了第一个Go语言QQ讨论组)。此外,微信的各种论坛随处可见。在过去十年中,Go语言华人社区也非常活跃,社区数量稳步增长。以下简要回顾一下我所知道的Go社区中的一些人和事。

矿泥

如果您在2010年使用Go语言,您一定会听到Fango的名字。 Fango是来自新加坡的Go语言爱好者。在Go之后不久,他写了第一个(可能是唯一一个)Go主题《胡文Go》,他也发表了第一个。这个Go语言中文教科书《Go语言云动力》。感谢Fango为您带来精彩的Go语言故事。

徐世伟,齐牛云

七头牛是全国第一家在大面积采用Go语言开发的公司,现在是Go1.0正式发布之前的时间。徐世伟也是大中华区第一位着名的Go语言传播者。许世伟和齐牛云也在2012年发表了一篇《Go语言编程》教程,而且这本书可能只有一个月的时间。编辑都是杨海玲的老师。后来,七匹牛中有许多与Go相关的专着或翻译。可以说,2015年之前,徐世伟和齐牛云团队绝对是推动国内Go语言社区的主力军。

我也首先阅读了本书《Go语言编程》,我对如何实现接口和Goroutine调度模拟仍然印象深刻。感谢徐世伟的签名版《Go语言编程》,也为新的《Go语言高级编程》写作顺序,谢谢徐达!

Astaxie和GopherChina会议

谢大的最早印象是,2012年左右,当他开设免费《GoWeb编程》书时,目前许多QQ小伙伴参与了评审(如4月平民,边江和OlingCat等)。 GoWeb编程是每个人都更关注的方向。本书不仅讨论了ORM的实现,还讨论了beedb等组件。这些组件,如beedb,首先演变为Beego框架。根据JetBrains不久前进行的一项调查,Beego是Go中三个流行的Web框架之一。

然后在2015年,谢达正式开启了GopherChina会议。虽然因为其他事情我没有参加现场,但我也预定了第一次GopherChina会议的衬衫。然后在2018年,我终于作为讲师参加了在上海举行的GopherChina会议,与您分享了CGO方向的技术,并首次见到了谢达神。感谢谢达的GopherChina会议和《GoWeb编程》!

其他人和项目

另外,还有很多着名的Go爱好者,如《LearningGo》和GoTour的中文翻译明星,创造了一个gogg无知,一个OlingCat在翻译Go官方文件,雨痕《Go语言学习笔记》来Go源深度解读,创造了GoHackers的郝琳等。此外,国内PingCAP公司开发的开源TiDB分布式数据库也是一个非常有名的项目。感谢Go China社区的这些朋友和项目,每个人都在努力将Go语言的繁荣带到这个国家。

向Go学习

侯杰老师曾经说过:不要在浮沙上搭建一个平台。中国互联网公司的繁荣更多地处于业务层面,几乎所有基础软件都不是由中国创造的。作为一名认真的软件开发人员,我们需要学习Go语言并继续掌握基础理论基础。我们不应该只关注业务层面。否则,下一次中美贸易战仍将由西方采取。

经过这么多年的发展,中国的软件产业已经非常繁荣和成熟,许多软件开发商已经开始进入35岁的中年门槛。事实上,35岁是软件开发人员第二职业生涯的开始,是时候开始形成自我创造。然而,一些资本家短视的996或007以及其他急于求成的渴望正在引导中国软件人才进入创新阶段并过早衰落。中国的软件工程师不应该是农民的代码,也不应该编写动物代码,尽管我们不会大喊口号,但总是默默地行动。

目前,中国有大量的软件开发人员有能力参与基础软件的设计和开发。由于这个脚踏实地的程序开发人员的努力,我相信我们可以在未来十年继续前进。

作者:柴杉树,第一批语言爱好者Go,Go贡献者,还有《Go语言高级编程》和《WebAssembly标准入门》作者。 Github账号是chai2010。

20: 57

来源: CSDN

Go语言已有十年历史,Go2已准备就绪

作者|柴树山

主编|郭焱

在21世纪的第一个十年,计算机开始在中国大陆流行,高校的计算机相关专业逐渐流行起来。那时,学校主要学习C/C ++和Java语言,其中大部分语言都是在20世纪90年代或更早的时候诞生的。因此,这些计算机领域的理论知识或编程语言似乎是上帝创世纪作为计算机的产物。相关领域的学生只能期待这些结果。

Go语言诞生于21世纪,当时新一波的工业编程语言即将爆发。编译器语言Rust,Kotlin和Switft诞生于2010年左右。前端诞生了Dart和Type等工业语言。最新的V语言甚至试图在Go和Rust的肩膀上进行创新。而这些变化都发生在我们身上,让中国计算机爱好者在学习过程中见证历史的发展,甚至有机会参与其中。

2019年是CSDN成立20周年和Go语言十周年。感谢CSDN平台提供的机会,我可以在过去十年中与您分享一些有关中国围棋社区的故事。

Go语言诞生了

Go语言最初由Google的Robert Griesemer,KenThompson和RobPike于2007年发明。其设计的最初功能来自于对超复杂C ++ 11特性的宣传报告的蔑视,最终目标是设计C语言在网络和多核时代。到2008年中期,大部分语言的功能设计已经完成,并开始实现编译和运行,大约在同一时间RussCox作为主要开发人员加入。到2009年,Go语言逐渐稳定下来。同年9月,Go语言正式发布并开源。

以上是《Go语言高级编程》第一章的第一部分。当Go语言只是开源时,每个人都对其编译速度印象深刻:二级编译已经完成,它可以像脚本一样编译和执行。同时,Go语言的隐式接口使编译语言具有duck类型的能力。作者还第一次意识到C ++的原始虚拟表vtab也可以动态生成!至于每个人最愿意讨论的不是特征,它不是Go新发明的基石。早在20世纪80年代和90年代,许多语言开始尝试将CSP理论引入编程语言(RobPike是一个坚定的实践者)。 )。然而,早期CSP实践的语言没有进入主流开发领域,这导致了这种并发模型的陌生。

除了语言功能的创新之外,Go还附带了一套编译和构建工具,而小型标准库则带有完整的Web编程基础结构。我们可以轻松编写支持Go语言的高并发访问的Web服务。

作为互联网时代的C语言,Go语言终于进入了主流编程领域。

去语言十年推进

Go自2007年开始设计,并于十年前于2009年正式宣布。 Go语言已经稳定了十年,而且在2019年仍然可以编译和运行Go1.0代码而不需要修改。但是在保持语言稳定性的同时,Go语言逐渐巩固了基础,并且已经接近完美的极限十年。让我们来看看过去十年Go语言的变化。

界面更改

第一个是查看界面中的更改。第一次是2009年刚刚开源的时候,这个时候可以说是Go语言的古老时代。 Go语言主页如下:

那个时代的Gophers使用hg工具下载代码(而不是Git),Go代码托管在GoogleCode(而不是GitHub)上。随着代码的发展,hg已逐渐淡出Gopher的愿景,而GoogleCode网站已经关闭,Go1之前古代的Go代码已经开始慢慢衰退。

家庭中心是Go语言的最初口号:Go是一种富有表现力的并发编程语言,而且很简单。与此同时,我举了一个“你好,世界”的例子(注意这里的“世界”是日语)。

然后右上角是初学者的天堂:第一个是安装环境,然后是早期的三天教程,第三个是使用标准库。右上角的图片是RussCox的视频,仍应在Youtube上找到。

左上角是Go的经典文档。此外,常见问题解答,语言规范和内存模型是非常重要的核心温度。左下角还有文档链接,例如cmd,子页面的内容应保持不变。

然后在2012年,Go1的第一个正式版本发布了,语言,标准库和godoc在Go1之前得到了广泛的改进。 Go1样式页面效果如下:

当新页面刚刚出现时,有一种明亮的眼睛感觉。这是具有最长时间的页面布局。但不仅是作者,甚至是Go语言官员也慢慢厌倦了中文页面。因此,从2018年开始,Go语言开始了新的标识和网站重新设计工作。

以下是新的Go语言徽标:

2019年是Go语言发展的极其重要的一年。 Go1.13将于今年8月发布,这个版本将正式重启Go语言语法的演变并向Go2迈进。在Go1.13正式发布之前,新网站已于7月推出:

头上的按钮式菜单已经变成了平铺的风格,看起来更高。同时,页面的颜色已经过调整,以保持与新Logo相同的颜色。页面布局也已调整,下载的左右列已经交换。与此同时,仓鼠的头部位于一侧,据估计颈椎病复发。

一般来说,Go的官方网站经历了三个阶段:Go1,Go1(1.0~1.10),Go1(或Go2),并对应3种风格。新的布局可能是未来十年Go2的主页。

语法上的变化

尽管Go语言诞生于2009年,但Go1的第一个正式版本于2012年发布。事实上,在Go1诞生之前,Go语言足够稳定。国内的齐牛云在Go1之前开始转向Go语言开发。它是中国第一家采用Go语言的互联网公司。 Go1的目标是梳理标准库的语法和黑暗角落,为未来10年奠定坚实的基础。

从目前的结果来看,Go1无疑是一项伟大的成就。 Go1时代的代码仍然可以使用最新的Go语言工具进行编译而无需修改(不包括CGO或汇编语言部分,因为这些扩展工具不在Go1的承诺范围内)。但是,在Go1之后仍然有一些语法更新。在Go1.10之前,Go1时代语法和标准库部分有三个主要变化:

第一个主要的语法变化是将容量控制添加到2012年发布的Go1.2中的切片语法,这将防止不同的切片意外地与具有相同底层数组的其他切片的内存交叉。

第二个主要变化是在2016年发布的Go1.7标准库中引入了上下文包。上下文包是Go语言的Go实现,Go的并发编程实践简化了多个Goroutine和之间的数据,超时和退出。请求域以处理单个请求。上下文包启动后,它很快被社区吸收。例如,gRPC和许多Web框架通过上下文控制Goroutine的生命周期。

第三个主要的语法变化是2017年发布的Go1.9,它引入了类型别名的特征:typeT1=T2。类型别名T1由T2通过=符号定义,其中T1和T2完全相同。引入类型别名的原因是Go1.7将上下文扩展库移动到标准库所引起的问题得以解决。由于context.Context类型分别在标准库和扩展库中定义,因此不同包中的类型不兼容。许多开源库(如gRPC)在原始扩展库中使用了context.Context类型,这导致它与Go1.7标准库中的context.Context类型不兼容。这个问题最终通过类型别名来解决:扩展库中的context.Context类型是标准库中context.Context的别名类型,从而实现了与标准库的兼容性。

语法细节也有一些变化,例如Go1.4增强for循环语法和Go1.8版本,以对具有相同内存布局的结构施加约束。读者可以根据新的需求查看相关发布日志的文档。

运行时更改

运行时部分的最大变化是动态堆栈部分。在Go1.2之前,Go语言使用分段堆栈实现了堆栈的动态缩放。但是,分段动态堆栈存在性能问题,因为堆栈内存不连续,这将导致CPU缓存命中率下降,从而导致热点函数调用性能受到影响。因此,从Go1.3开始,应该有一个连续的动态堆栈。当堆栈移动时,连续动态堆栈部分地减轻了CPU堆栈上变量地址的变化。这直接带来了CGO编程,Go语言内存对象无法直接传递给C语言空间,因此Go语言官方为CGO问题开发了一个复杂的内存使用规范。

一般来说,如何实现动态堆栈是一个如何选择的问题,因为没有银弹,鱼和熊掌不能兼得,目前的选择是首先要保证纯Go程序的性能。

GC性能改进

Go语言是一种具有自动垃圾收集(GarbageCollection)的语言,称为GC(注意这是大写的GC,小写的gc代表Go语言编译器)。自Go诞生以来,GC的回收性能成为人们关注的热门话题。

Go语言可以支持GC功能的原因是Go语言中的每个变量都具有完整的元信息,并且元信息可以轻松跟踪所有指针的声明周期。在Go1.4之前,GC使用STW以回收内存的方式阻止世界。暂停通常是几秒甚至几十秒。因此,早期社区有很多关于如何规避或减少GC操作的技巧。

第一次GC性能变化发生在Go1.5期间。目前,Go语言运行时和工具链都已经从C语言实现到Go语言,这有助于重构和优化GC代码。 Go1.5第一次切换到并行和增量方式来回收内存,这将GC缩短到几百毫秒。以下图片是官方网站“GoGC: LatencyProblemSolved”中提供的数据:

Go1.5并发和增量改进是显而易见的,但最重要的是为未来的改进奠定基础。在Go1.5之后的Go1.6版本中,GC性能终于开始提高:从Go1.6.0暂停时间到数十毫秒,Go1.6.3减少到不到10毫秒。 Go1.6的结果在Go1.8的官方日志中得到了证实:Go的GC通常小于100毫秒。甚至不到10毫秒!

当然,Go的GC优化步骤不会停止,但是重新创建Go1.5和Go1.6的令人兴奋的结果更难以估计。在Go1.8之后的几个版本中,官方发布日志很少见到量化的GC性能改进数据。

去语言引导过程

据说Go语言最初是基于Thompson的C语言编译的,初始输出是C语言代码(在它发布之前)。在Go1.4的开源之前,Go语言编译器和运行时是用C语言实现的。这样你就可以在早期用C语言实现Go语言功能了!由于强烈依赖C语言工具链,Go1.4之前的Go语言完全无法启动。

从Go1.4开始,Go语言运行时在Go中实现。具体实现方法是Go团队的RSC首先为Go代码转换工具实现简化的C代码。该工具主要用于将以前C语言的Go语言运行时转换为Go代码。因为它是自动转换的代码,所以您可以获得更可靠的Go代码。在将运行时转换为Go实现之后,第一个好处是GC确切地知道每个内存指针的状态(因为Go变量具有详细的类型信息),这也提供了Go1.5重写GC。运行时基础。

然后转到Go1.5并将编译器转换为Go实现。但转换为代码性能有一定的下降。许多程序的编译时间甚至慢到几十秒。在此期间,Internet上存在很多问题,编译Go1.5的速度很慢。 Go1.5使用Go语言编写编译器,并对工具链和目标代码进行了大量的重构工作。在Go1.5之后,交叉编译变得非常简单,只要GOOS=linuxGOARCH=amd64gobuild命令可以从任何Go语言环境生成Linux/amd64对象代码。

Go语言编译器是否有后门?如果后门编译器编译的Go程序有后门,是否有后门?后门编译器编译的Go编译器程序是否有后门?

尝试失败

Go语言开发过程并非都是成功案例,但也有一些失败的尝试。失败是成功的母亲。尽管这些尝试最终都失败了,但试验过程中积累的经验为新的方向提供了动力。

因为Go语言常量只支持几种类型,例如numeric和string,所以早期社区一直在调用切片的只读类型。为此,rsc首先在开发分支中实验性地实现了此功能,但在随后的实践中,它发现了许多与Go编程功能冲突的问题,因此在短暂尝试后放弃了只读切片的特性。当然,初始化后无法修改的变量特性仍然是每个人都期望的特征(类似于其他语言的最终特征),并希望在未来的Go2中有一些改进。

另一种尝试是早期基于供应商的版本管理。供应商和内部功能首次在Go1.5中引入,供应商用于打包外部第三方软件包,内部用户保护内部软件包。后来,供应商被开源社区的各种版本管理工具滥用,导致Go语言代码出现了一些无法构建的奇怪问题。滥用供应商导致供应商嵌套问题,这类似于nodejs社区中node_modules目录的嵌套。嵌套的供应商最终将出现在同一个包的不同版本中。这最后一根稻草最终打败了供应商机制,使官方Go语言团队从头开发了模块功能,彻底解决了版本管理问题。当Go1.13模块化正确时,GOPATH和供应商机制将被完全消除。

Go语言是一个开源项目,所有导入的包都必须有源代码。一些人声称是商业用户,称Go支持导入二进制包以最大限度地保护商业代码。为了满足社区的需求,Go1.7增加了导入二进制包的功能。但更具戏剧性的是,Go语言支持二进制包导入,并且没有多少人使用它,即使最初调用二进制包的人也没有使用(许多社区声音可能无法反映实际需求)。对于没有人使用的二进制包功能,Go语言团队需要付出相当大的努力来维护代码。为了减少这种不必要的功能,Go1.13将完全关闭二进制包的功能并解决新灯的实际需求。当然,Go语言已经支持生成静态库,共享库和插件的能力,并且它还可以通过这些机制保护代码。

可能会有一些失败的尝试,例如最近实现的try内置函数,以简化Go的父亲之一Robert Griesemer的错误处理,但被拒绝了。失败的尝试是一个好兆头,表明Go语言仍然在一些新兴领域。 Go语言仍然有效。

Go2发展方向

Go语言最初是一种简短而简洁的语言。经过多年的发展,Go1已接近稳定极限。在官方网站的谈话页面上查看报告的数量可以发现2015年之前各种报告的高峰期,从2016年到2017年共享的数量已经开始大幅下降,自2018年以来没有包含新的报告,是因为Go1语言的功能已被多次说过。第一波Go语言爱好者也是如此。 Go没有新的功能可以挖掘和学习,或者它不够酷。我们认为官方的Go语言团队感觉就像这样,所以我们在2018年首先开始解决模块化问题,然后开始正式讨论Go2的新特性,并重新开始Go1.13语言的演变。

模块化与构建管理有关。在Go语言的开头,它实际上是用Makefile目标构建的。然后gobuild命令的官方构建提供零配置文件构造,这极大地简化了构建过程。然后是goget命令,支持从Internet自动下载hg或git存储库代码进行构建,同时引入GOPATH环境变量以防止非标准库代码。从那时起,第一波版本管理工具也开始出现,通过动态调整GOPATH来导入特定版本的代码。然后,各种开源仿制和克隆版本管理工具如雨后春笋般涌现,基本上模仿了godeps的设计理念,基于GOPATH和后来的供应商来管理依赖包的版本,最终导致了对供应商的过度滥用(The上一篇文章中已经提到过供应商滥用问题。最后,在2018年,RSC亲自发明了基于最小化版本依赖性算法的版本管理功能。模块化功能是从Go1.11引入的,将在Go1.13中正式修正。在此之后,GOAPATH将完全退出历史舞台。

由于rsc的工作直接判断了开源社区各种版本管理工具的死亡,它也导致了官方Go语言团队与开源社区之间的许多冲突和矛盾。在这种情况下,Go语言的开发并不是完全开源的。 Go语言的开源仅限于提交问题或修改BUG。真正的语言设计始终是教会长老会教会的典范。作者认为这是开源的最佳方式。许多开源社区的例子也说明了独裁者的作用,而退伍军人就是这个角色。

在Go1.13中,除了模块化性质之外,还有许多语法上的改进:十六进制浮点数,大数字可以用下划线分隔,二进制和八进制面额常量等等。但是Go1.13在错误标准库方面也有了重大改进。错误库添加了三个函数,Is/As/Unwrap,它们将用于支持错误重新打包和识别处理,为Go2中的新错误处理改进做准备。随后的改进方向是错误处理的控制流程。已经提出了使用try/check关键字和try内置函数改进错误处理过程的先前提议。目前尚未确定任何解决方案。

Go2最令人期待的功能是泛型。从Go语言开始,官方显然已经拒绝了仿制药,并于2018年开始公开讨论仿制药,让通用粉丝看到了希望。许多人,包括早期的Go官员,都会说使用接口来模拟泛型实际上是一个借口。泛型的最大问题不是性能,而只有泛型可以为通用容器或算法提供类型安全的接口。例如,Add(a,bT)T泛型函数无法通过接口实现返回值类型的检查。如果Go语言支持泛型,然后结合Go汇编语言支持的AVX512指令,您可以预期Go语言将在CPU密集型字段中占有一席之地,甚至可以实现纯Go语言机器学习算法图书馆将来会出现。

最后要注意的是WebAssembly平台的Go语言支持。根据Ending定律:可以编译成WebAssembly的所有东西最终都会被编译成WebAssembly。 2018年,FabriceBellard将Windows 2000操作系统迁移到基于WebAssembly技术的浏览器环境。 WebAssemblySystemInterface技术出现在2019年,这可能是一个更轻量级的Docker替代品。 Go语言还有TinyGo的变体版本,目标是在受限环境(例如WebAssembly或其他微控制器)中更好地运行Go程序。

去中国语言

回想一下,Go语言的第一个例子就是它发布时,它被打印成'Hello,World'。不幸的是,这里的“世界”不是中国人的“你好,世界”,而是日本人的“你好,世界”。日语仍然以汉字的转换为基础,这是整个中国世界的悲哀!

幸运的是,中国程序员更强大。目前,中国不仅是世界上关注度最高的国家,也是排名第二的国家。根据谷歌趋势数据,Go语言占全球在中国90%以上的关注度:

不仅是Go用户,而且中国的Gopher对Go的贡献也落后于美国。其中,魏京光在2010年深入参与Go语言开发,将Go语言移植到Windows系统并实现CGO支持。之后,来自中国的Minux实现了iOS等许多平台的移植,并正式加入了Go语言开发团队。目前,Go语言的最高贡献者是来自天津的Shi Bin(benshi001)。他的工作主要集中在编辑的优化上,在全球Go语言贡献者中排名第39位。

最早的Go语言中国爱好者通过谷歌讨论组golang-china讨论,讨论组将继续发表新文章。然后,在2012年左右,由于诸多因素,国内讨论开始关注QQ群(作者在2010年在中国建立了第一个Go语言QQ讨论组)。此外,微信的各种论坛随处可见。在过去十年中,Go语言华人社区也非常活跃,社区数量稳步增长。以下简要回顾一下我所知道的Go社区中的一些人和事。

矿泥

如果您在2010年使用Go语言,您一定会听到Fango的名字。 Fango是来自新加坡的Go语言爱好者。在Go之后不久,他写了第一个(可能是唯一一个)Go主题《胡文Go》,他也发表了第一个。这个Go语言中文教科书《Go语言云动力》。感谢Fango为您带来精彩的Go语言故事。

徐世伟,齐牛云

七头牛是全国第一家在大面积采用Go语言开发的公司,现在是Go1.0正式发布之前的时间。徐世伟也是大中华区第一位着名的Go语言传播者。许世伟和齐牛云也在2012年发表了一篇《Go语言编程》教程,而且这本书可能只有一个月的时间。编辑都是杨海玲的老师。后来,七匹牛中有许多与Go相关的专着或翻译。可以说,2015年之前,徐世伟和齐牛云团队绝对是推动国内Go语言社区的主力军。

我也首先阅读了本书《Go语言编程》,我对如何实现接口和Goroutine调度模拟仍然印象深刻。感谢徐世伟的签名版《Go语言编程》,也为新的《Go语言高级编程》写作顺序,谢谢徐达!

Astaxie和GopherChina会议

谢大的最早印象是,2012年左右,当他开设免费《GoWeb编程》书时,目前许多QQ小伙伴参与了评审(如4月平民,边江和OlingCat等)。 GoWeb编程是每个人都更关注的方向。本书不仅讨论了ORM的实现,还讨论了beedb等组件。这些组件,如beedb,首先演变为Beego框架。根据JetBrains不久前进行的一项调查,Beego是Go中三个流行的Web框架之一。

然后在2015年,谢达正式开启了GopherChina会议。虽然因为其他事情我没有参加现场,但我也预定了第一次GopherChina会议的衬衫。然后在2018年,我终于作为讲师参加了在上海举行的GopherChina会议,与您分享了CGO方向的技术,并首次见到了谢达神。感谢谢达的GopherChina会议和《GoWeb编程》!

其他人和项目

另外,还有很多着名的Go爱好者,如《LearningGo》和GoTour的中文翻译明星,创造了一个gogg无知,一个OlingCat在翻译Go官方文件,雨痕《Go语言学习笔记》来Go源深度解读,创造了GoHackers的郝琳等。此外,国内PingCAP公司开发的开源TiDB分布式数据库也是一个非常有名的项目。感谢Go China社区的这些朋友和项目,每个人都在努力将Go语言的繁荣带到这个国家。

向Go学习

侯杰老师曾经说过:不要在浮沙上搭建一个平台。中国互联网公司的繁荣更多地处于业务层面,几乎所有基础软件都不是由中国创造的。作为一名认真的软件开发人员,我们需要学习Go语言并继续掌握基础理论基础。我们不应该只关注业务层面。否则,下一次中美贸易战仍将由西方采取。

经过这么多年的发展,中国的软件产业已经非常繁荣和成熟,许多软件开发商已经开始进入35岁的中年门槛。事实上,35岁是软件开发人员第二职业生涯的开始,是时候开始形成自我创造。然而,一些资本家短视的996或007以及其他急于求成的渴望正在引导中国软件人才进入创新阶段并过早衰落。中国的软件工程师不应该是农民的代码,也不应该编写动物代码,尽管我们不会大喊口号,但总是默默地行动。

目前,中国有大量的软件开发人员有能力参与基础软件的设计和开发。由于这个脚踏实地的程序开发人员的努力,我相信我们可以在未来十年进一步发展。

作者:柴杉树,第一批语言爱好者Go,Go贡献者,还有《Go语言高级编程》和《WebAssembly标准入门》作者。 Github账号是chai2010。

仅提供信息存储空间服务。

语言

转到

GO1

供应商

标准库

读()

投诉