本系列旨在梳理 Go 的 release notes 与发展史,来更加深入地理解 Go 语言设计的思路。
https://go.dev/doc/go1.3
Go 1.3 版本在 Go 1.2 发布六个月后推出, 该版本重点在于实现层面的改进,没有包含语言层面的变更。 主要改进包括:实现了精确的垃圾回收(GC),对编译器工具链进行了大规模重构以加快编译速度(尤其对于大型项目),全面的性能提升,增加了对 DragonFly BSD、Solaris、Plan 9 和 Google Native Client(NaCl)的支持。此外,还对内存模型在同步方面进行了重要优化。
Go 1.3 值得关注的改动:
内存模型的变更: Go 1.3 内存模型增加了一条关于缓冲通道(buffered channel)发送和接收的新规则,明确了缓冲通道可以用作简单的信号量(semaphore)。 这并非语言层面的改动,而是对预期通信行为的澄清。
栈(Stack)实现的变更: Go 1.3 将 goroutine 栈的实现从旧的“分段栈”模型改为了“连续栈”模型。 当 goroutine 需要更多栈空间时,其整个栈会被迁移到一个更大的连续内存块,消除了跨段边界调用时的“热分裂”性能问题。
垃圾收集器(Garbage Collector)的变更: Go 1.3 将精确 GC 的能力从堆(heap)扩展到了栈(stack),避免了非指针类型(如整数)被误认为指针而导致内存泄漏,但同时也对 unsafe 包的使用提出了更严格的要求。
Map 迭代顺序的变更: Go 1.3 重新引入了对小容量 map(元素个数小于等于 8)迭代顺序的随机化。 这是为了修正 Go 1.1 和 1.2 中未能对小 map 实现随机迭代的问题,强制开发者遵循“map 迭代顺序不保证固定”的语言规范。