1 Go语言初探
GO语言简介
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。发布于2009年,目前最新版本为1.12。
Go号称21世纪的c语言,着重于分布式高并发的开发场景,针对网络编程、并发编程、分布式编程而设计,这种设计理念更适应现代软件的发展趋势,你会惊讶于Go在这些场景的开发效率和运行效率之高。
Go语言的设计理念
学习并使用一门语言,首先应该了解其设计理念,理解设计理念会帮助你更好的使用它,是不是好?它是为解决什么问题设计?这样做有什么优缺点?在实际应用中加入自己的思考对你帮助会很大。下面列出其主要设计理念:
- 少即是多:做特定的事情只提供一种方法,并把事情做到极致;
- 正交性:Go的特性是正交的,协程、管道、类型系统等特性都密切配合。
- 并发应该更简单,简单到只需一个关键字,在语言层面支持;
- 区分错误和异常:错误是业务的一部分,异常不是;
- 复杂留给自己,简单留给用户:Go编译器封装许多复杂性实现,如并发调度器,垃圾回收等,用户只需管理好业务实现即可。
- 面向接口编程而不是面向对象编程;
- 组合优于继承:
- ...
Go语言历史版本的特性升级介绍
1.12
-
go tool vet 不再支持;
-
二进制包在下个版本将不再支持;
-
go tool tour 不再包含在主二进制发行版中,需要手动安装;
-
Go 1.12 在 trace 工具加入了Mutator Utilization 图的支持,它可以方便发现 GC 性能受限的情况;
-
Go Module 进一步支持。计划在 Go 1.13 默认启用 module 模式。
-
提升了大量堆(Heap)活跃状态情况下的清理性能,这减少了垃圾回收之后的分配延迟,可以更好地将内存释放回操作系统;
-
Runtime 的 timer 和 deadline 代码随着 CPU 数目的增加,会有更好的表现。这提升了网络连接最后期限(deadline)相关操作的性能;
-
对大型堆分配的相关修复,提升了内存配置文件的精确性;
-
TLS 1.3支持,Go 1.12 在 RFC 8446 指定的crypto/tls包中添加了对 TLS 1.3 的选择支持。可以通过将值 tls13 = 1 添加到 GODEBUG 环境变量来启用它。 它将在 Go 1.13 中默认启用。
1.11 (里程碑版本:全新的go modules包管理,解决了长久以来对GOPATH的依赖问题。)
- 实验性支持 WebAssembly (js/wasm)。
- 实验性启用版本和依赖管理 Modules,替代 GOPATH。
- 最后一个支持 GOCACHE=off 的版本。
- 编译器支持内联更多类型函数,包括调用 panic 的函数。
- 编译优化 map delete、slice append。
- 更准确的调试信息,对没有 -N -l 编译结果提供更好支持。
- 允许在 delve 调试器中调用函数。
- 最后一个支持 godoc 命令行的版本,未来基于 web。
- 内存分配器使用稀疏堆,不再有 512GB 限制。
符号 @ 在 module 中有特殊含义,命令行不再支持 @ 符号。
1.10
- 工具链从可执行文件路径推导 GOROOT。
- 可用 GOTMPDIR 设置专用临时目录。
- 使用 GOCACHE 缓存编译结果,与 GOROOT/GOPATH 中已安装的编译结果隔离。
- 编译参数(gcflags 等)仅作用于命令行列出的包。
- 安装命令(go install)仅安装命令行列出的包,不含依赖项。
- 单元测试(go test)也将使用缓存加速。
- 性能测试(go tool pprof)新增 WEB 界面。
- 堆栈跟踪(stack trace)不再包含编译器自动生成(autogenerated)的函数。
- GOMAXPROCS 最大限制取消。
- LockOSThread/UnlockOSThread 嵌套数量必须匹配。
1.9
- 类型别名。
- 并行编译。(GO19CONCURRENTCOMPILATION=0 禁用)
- 工具集默认不再扫描 vendor 目录。
- 安装目录不再固定。(可显式设置 GOROOT)
- 新增 sync/map。
- 新增 test helper。
- 新增 pprof label。
1.8
- 不同的 tag 不再阻止 struct 显式转换。
- 改善 map 并发操作检测。
- 垃圾回收暂停时间进一步缩短到(10~100 us)。
- 函数参数生命周期不再等同整个栈帧,可被提前回收,需用 KeepAlive 保持。
- 改进 defer、CGO 调用开销(一半)。
- 编译后端 SSA 支持所有平台,gcflags -ssa=0 参数被移除。
- 支持默认 GOPATH 设置 $HOME/go。
- 支持插件模式(buildmode: plugin)。
- 支持 mutex profile。
- 工具链 yacc 移除。
- 工具链 pprof 支持 https+insecure 模式。
- HTTP2/push,HTTP Server Graceful Shutdown。
1.7
- AMD64 使用 SSA 后端,可使用 gcflags "-ssa=0" 关闭。
- 新二进制格式。
- 链接器不再支持 -X name value,须使用 -X name=value。
- 包依赖 vendor 成为正式功能,移除 GO15VENDOREXPERIMENT 环境变量。
- 为 x86–64 增加对 Linux’s perf、Intel’s VTune 工具支持(设置并保存 BP 寄存器值)。
- 实验性支持 Binary-only package。(静态包,不再需要源码文件)
- BP 寄存器可选: 在 make.bash 构建工具链时添加GOEXPERIMENT=noframepointer 屏蔽。
1.6
- CGO 支持指针共享。
- 重写 parser,替代 yacc 生成。
- 编译器增加 -msan 参数,支持 Clang MemorySanitizer,用于探测读未初始化内存(CGO)。
- 增加 buildmode c-shared 支持。
- GO15VENDOREXPERIMENT 默认 1。
- HTTP2 支持。
1.5 (里程碑版本:go编译器由go自己实现,支持vendor)
- 用 Go 重写运行时和编译器,需要使用 Go 编译 Go。
- 对 6g、6l 重命名,改为 compile、linker、asm。
- 新 GC 算法,实现并发标记和清理,增加控制器和辅助回收等。
- GOMAXPROCS 默认 cores 数量。
- 增加 buildmode 支持,生成共享库。
- 支持 internal、vendor 包。
- 支持 go tool trace 命令,跟踪执行过程。