只挑我感兴趣的,完整release note在Go 1.27 Release Notes - The Go Programming Language
升级#
go install golang.org/dl/go1.27rc1@latest
go1.27rc1 download泛型方法#
Go 1.27 开始支持:
func (s Set[T]) Map[U any](f func(T) U) []U {
...
}很多 Fluent API、集合库、Stream 库终于能写得自然:
users.
Filter(...).
Map(...).
GroupBy(...)警告
接口方法仍然不能声明类型参数
type Reader interface { Read[T any]() T } // ❌
encoding/json v2 正式进入标准库#
当然是有v2用v2:性能提升、规范增加、功能增加
添加了两个包:
encoding/json/v2包提供了Marshal,MarshalWrite,MarshalEncode,Unmarshal,UnmarshalRead,以及UnmarshalDecode,所有这些都接受可变参数Options用于配置序列化和反序列化行为的参数encoding/json/jsontext包提供对 JSON 的底层语法处理。Encoder和Decoder类型按以下方式运行 JSON 作为序列Token和Value,维护一个状态机以确保生成或使用的序列是有效的 JSON 文本
默认设置和v1有一些不同的地方,例如严格大小写、拒绝非法utf8字符、拒绝重复名称之类的
而且还添加了Options选型,可以用来调控行为
goroutine泄漏侦察#
goroutineleak是一个新profile,可以用来检测泄漏的goroutine
泄漏的goroutine就是阻塞在某些
并发原语上的goroutine,而且这些并发原语只有它们自己持有,所以绝无唤醒的可能
在1.26就作为实验性功能启用,在1.27正式启用了
原理是可达性,所以如果并发原语是全局变量或者能被其他goroutine访问的话,是无法发现leak的
uuid进入标准库#
字面意思,新的uuid包可以用来生成和解析UUID
官方UUID库只支持uuidV4和uuidV7
据说官方的UUID库在浏览器上生成uuid的时候,uuidv7的时间相关序列会被抹平。因为浏览器处于安全考虑,提供的时间精度很低。所以官方和社区的解决方案是降级为用crypto/rand来生成随机安全比特,为了UUIDv7的递增性,所以是累加的