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 命令,跟踪执行过程。