Golang
简介编辑本段
在2016年,Go被软件评价公司TIOBE(英语:TIOBE Programming Community Index)选为“TIOBE 2016年最佳语言”。目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。
基本信息编辑本段
外文名 Golang
别名 Go
属 性 编程语言
发布于 2009年
发布组织 Google
最新版本 1.16.5
编程范型 编译型,可平行化,结构化,指令式
操作系统 Linux、macOS、FreeBSD、Windows
设计者 Robert Griesemer、罗勃·派克、肯·汤普逊
许可证 BSD
主要实现产品 gc (8g,6g,5g),gccgo
描述编辑本段
与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收功能、接口等特性的语言级支持。Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
不同于Java,Go原生提供了关联数组(也称为哈希表(Hashes)或字典(Dictionaries))。
批评编辑本段
Golang 的垃圾回收机制一直被人诟病,直到 Golang 1.8 版本垃圾回收的功能才较为稳定。然而尽管如此,Golang 的垃圾回收还是远远落后 JVM 的 G1 和 ZGB。 Discord 的研发团队在2020年初甚至发表一篇博客,宣布将从 Golang 转移至 Rust,理由是 Go 的垃圾回收会导致每2分钟出现一次卡顿,并且 Discord 研发团队测试了 Go 语言的1.8、1.9、1.10版本这个问题都没有改善。
历史编辑本段
- 静态类型和运行时效率。(如:C++)
- 可读性和易用性。(如:Python 和 JavaScript)
- 高性能的网络和多进程。
Go于2009年11月正式宣布推出,版本1.0在2012年3月发布。之后,Go广泛应用于Google的产品以及许多其他组织和开源项目。
在2016年11月,Go(一种无衬线体)和Go Mono 字体(一种等宽字体)分别由设计师查尔斯·比格洛(英语:Charles Bigelow)和克莉丝·荷姆斯(英语:Kris Holmes)发布。两种字体均采用了WGL4(英语:WGL4),并且依照着 DIN 1450 标准,可清晰地使用了 large x-height 和 letterforms 。
在2018年8月,本地的图标更换了。待描述完整 然而,Gopher mascot 仍旧命相同的名字。
在2018年8月,Go的主要贡献者发布了两个关于语言新功能的“草稿设计——泛型和异常处理,同时寻求Go用户的反馈。Go 由于在1.x时,缺少对泛型编程的支持和冗长的异常处理而备受批评。
语言特征编辑本段
撰写风格
- 每行程序结束后不需要撰写分号(;)。
- 大括号({)不能够换行放置。
- if判断式和for循环不需要以小括号包覆起来。
- 使用 tab 做排版
轻型协程
Go的主要特色在于易于使用的并行设计,叫做Goroutine,透过Goroutine能够让程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go也非常地适合网络服务。
Goroutine是类似线程的概念,属于纤程(区别于协程和线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易;而协程的主要作用是提供在一个线程内的并发性,却不能利用多个处理器线程。而 Goroutine就像轻量级的线程,一个Go程序可以运行超过数万个 Goroutine[30],并且这些性能都是原生级的,随时都能够关闭、结束,且运行在多个处理器线程上。一个核心里面可以有多个Goroutine,透过GOMAXPROCS参数你能够限制Gorotuine可以占用几个系统线程来避免失控。
在内置的官方包中也不时能够看见Goroutine的应用,像是net/http中用来监听网络服务的函数实际上是创建一个不断运行循环的Goroutine;同时搭配了epoll 等IO多路复用机制维护Goroutine的事件循环。
编译器编辑本段
当前有两个Go编译器分支,分别为官方编译器gc和gccgo。官方编译器在初期使用C写成,后用Go重写从而实现自举(英语:Bootstrapping (compilers))。Gccgo是一个使用标准GCC作为后端的Go编译器。
官方编译器支持跨平台编译(但不支持CGO),允许将源代码编译为可在目标系统、架构上执行的二进制文件。
Gccgo 是Go程序设计语言的编译器前端,最初是在谷歌开发的,并于2009年11月发布。它最初是由Ian Lance Taylor写的,它使用GCC来实现的。 如今,Gccgo 已经不再依赖GCC编译器,因此如果您使用另一个编译器来构建也是可行的。
GCCGO能生成很好的执行代码,但缺少逃逸检测,会在很多小内存的分配和回收上损失一些性能。而另一个Go语言编译器 GC 却实现的不严谨,对32位系统支持很差。 在ARM芯片架构上不使用GCCGO编译的代码是靠不住的。
附件列表
词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。