Files
blog/docs/dev/language/golang/changelog.md
2025-07-01 08:15:44 +08:00

130 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Golang 版本变化
> [Release History](https://tip.golang.org/doc/devel/release)
持续更新golang版本更新变化内容只记录了一些值得关注的内容内容做了很大的精简仅做知识索引。
(本文是从1.22才开始记录的,老的版本记录得比较随意)
如果你对某一点有兴趣,推荐去官网查看详细内容。
某些变更知道后还是挺有用的,例如我之前遇到过一个随机数的问题,本地没问题,线上总是生成一样的随机数,
排查了一段时间才知道是因为没有设置随机数种子我本地用的是go1.20线上是go1.19在1.20版本时,会自动生成一个随机数种子。
## 1.24
> [Go 1.24 Release Notes](https://tip.golang.org/doc/go1.24)
- 🔥 要求Linux内核3.2+ 不再支持Linux内核2.6.32
- 🔥 macOS支持变更 最后支持macOS 11 Big Sur的版本1.25将要求macOS 12+
- 💥 完全支持泛型类型别名 类型别名现在可以像定义类型一样进行参数化
- 💥 移除SHA-1证书签名支持 `crypto/x509`不再支持SHA-1签名验证
- 💥 RSA密钥最小长度要求1024位 小于1024位的RSA密钥将返回错误
- ✨ 新增`os.Root`类型 提供目录限制的文件系统访问
- ✨ 新增`testing.B.Loop`方法 更快且不易出错的基准测试迭代方法
- ✨ 新增`runtime.AddCleanup`函数 比`SetFinalizer`更灵活高效的终结器机制
- ✨ 新增`weak`包 提供弱指针支持
- ✨ 新增`crypto/mlkem`包 实现ML-KEM-768和ML-KEM-1024后量子密钥交换
- ✨ 新增`crypto/hkdf``crypto/pbkdf2``crypto/sha3`包 从golang.org/x/crypto迁移
- ✨ 新增实验性`testing/synctest`包 支持并发代码测试
- ✨ JSON支持`omitzero`标签 比`omitempty`更清晰地省略零值
- ⚡️ 运行时性能提升2-3% 包括基于Swiss Tables的新map实现、更高效的小对象内存分配等
## 1.23
> [Go 1.23 Release Notes](https://tip.golang.org/doc/go1.23)
- 💥 `for range`支持迭代器函数 支持`func(func() bool)``func(func(K) bool)``func(func(K, V) bool)`类型的迭代器
- 💥 Timer和Ticker的重大变化
- 未引用的Timer/Ticker可立即被垃圾回收即使未调用Stop方法
- timer channel变为无缓冲容量0保证Reset/Stop调用后不会收到过期值
- ✨ 新增`iter`包 提供用户定义迭代器的基本定义
- ✨ 新增`unique`包 提供值规范化功能(类似"interning"或"hash-consing"
- ✨ 新增`structs`包 提供修改结构体属性的类型,如`HostLayout`标记符合主机平台期望的结构体布局
-`slices`包新增多个迭代器相关函数 如`All``Values``Backward``Collect``Sorted``Chunk`
-`maps`包新增多个迭代器相关函数 如`All``Keys``Values``Insert``Collect`
## 1.22
> [Go 1.22 Release Notes](https://tip.golang.org/doc/go1.22)
- 💥 `for range`不再是共享变量 这个变更可能会导致一些代码的行为发生变化
- 💥 支持`for i:=range 10`循环计数
- ✨ 新增`math/rand/v2`包 标准库的第一个v2版本包
-`http.ServeMux`路由增强
## 1.21
> [Go 1.21 Release Notes](https://tip.golang.org/doc/go1.21)
- 🔥 不再支持Windows 7
- 💥 `builtin`包新增`min``max``clear`函数
- 💥 支持WASIWebAssembly System Interface
- 💥 PGO默认开启
- 💥 GO团队对兼容性的承诺 [GODEBUG](https://go.dev/doc/godebug#history)
- ✨ 新增`log/slog`包、`slices``maps``cmp`
-`context`包新增WithoutCancel、WithDeadlineCause、WithTimeoutCause函数
## 1.20
> [Go 1.20 Release Notes](https://tip.golang.org/doc/go1.20)
- 💥 引入PGOProfile-guided optimization
- ⚡️ slice可以直接转为数组 不再需要先转化为指针了
- ⚡️ 优化unsafe包的切片/字符串操作
-`context`包新增`WithCancelCause`函数 可以传递取消原因
- ✨ 新增`arena`包、`math/rand`自动全局随机数
## 1.19
> [Go 1.19 Release Notes](https://tip.golang.org/doc/go1.19)
- 💥 新的内存模型
- ✨ 软内存限制(soft memory limit)
-`atomic`添加多个新函数
- ✨ 新的编译约束`//go:build unix`
## 1.18
- 💥 泛型支持
- 💥 模糊测试(Fuzzing)
- 💥 工作区模式
- ⚡️ append切片扩容策略变更
- ✨ 新增`net/netip`包、新增`strings/bytes.Cut`函数、`sync`包新增`TryLock`方法
## 1.17
- ✨ 新增`//go:build`指令
-`go.mod`支持`Deprecated`指令
- ✨ 允许切片转化为数组
- ⚡️ Go Module优化
## 1.16
- 💥 原生支持Mac M1
- 💥 Go module转正
- go build/run 不再自动更新go.mod和go.sum
- 添加`retract`指示符 可以废弃模块
- 💥 新增`embed`包 支持嵌入二进制文件
- ✨ 新增`runtime/metrics`包、`io/fs`
## 1.15
- 🔥 不再支持`darwin`32位系统
- ✨ 加入新的`linker`工具
- ✨ 增加`time/tzdata`包,
- ⚡️ `panic`展现形式调整
## 1.14
- 💥 支持异步抢占式调度 `runtime.GOMAXPROCS(1)`也不会阻塞了
- ⚡️ 优化`defer`性能
## 1.13
- 💥 Go module成为默认的依赖管理工具
- `GOPROXY`有默认初值并支持设置成多个代理的列表
- `GOPRIVATE`私有化模块
- 💥 错误处理的改进,增加了`errors.Is``errors.As``errors.Unwarp`等函数和支持`fmt.Errorf``%w`
- 💥 支持数字字面量改进,引入二进制字面量,以及`_`作为数字分隔符
-`go.mod`文件中引入`go`指令指定编译该模块所需的Go版本