大家好 我是煎鱼。今天 Go 1.26 已经正式官宣发布啦不管你是想尝鲜还是准备在组内做技术分享结合官方这篇《Go 1.26 is released[1])》作为起始入口应该能给你做一个快速导览。new 函数: 终于不用写三行了我们在写 Go 代码时经常需要初始化一个指向基础类型的指针。在 Go 1.26 之前这是一个很啰嗦的过程。以前的痛点如果你想得到一个指向int64(300)的指针你得这么写:package main import fmt func main() { // 以前的写法: 必须先定义变量 // 因为 操作符后面必须是变量 不能是字面量(literal) val : int64(300) ptr : val fmt.Println(*ptr) }是不是觉得很麻烦为了一个指针凭空多造了一个临时变量val。现在的写法Go 1.26 对内置函数new做了加强允许直接传入表达式。这不仅仅是省了代码行数 更是让语义连贯了。package main import fmt func main() { // Go 1.26 写法: 一步到位 // new 后面直接跟初始值表达式 ptr : new(int64(300)) // 甚至可以是函数调用的结果 // ptr2 : new(calculateValue()) fmt.Println(*ptr) }这就很舒服了尤其是当你构造结构体时某个字段是指针类型以前还得在外面定义好变量再塞进去现在直接new(value)扔进去就行。泛型自引用: 复杂结构福音泛型 (Generics) 这个特性大家是用得越来越顺手了。但是之前有个限制就是在定义类型参数时不能引用正在定义的这个泛型类型本身。这在实现一些链式调用或者特定设计模式时非常别扭。以前的尴尬假设我们要定义一个接口要求实现该接口的方法返回类型本身 (Fluent API 常见场景)。以前可能得绕弯子或者用any强转。现在的写法在 Go 1.26 中泛型类型可以在自己的类型参数列表中引用自己了。虽然这个听起来有点绕咱们看个代码就明白了。比如我们想定义一个通用的Clone接口:package main // Go 1.26: 泛型约束中可以直接引用 T 自身 // 这里 T 必须实现 Cloneable[T] 接口 type Cloneable[T any] interface { Clone() T } // 一个具体的结构体 type MyData struct { Value int } // MyData 实现了 Cloneable[MyData] func (m MyData) Clone() MyData { return MyData{Value: m.Value} } // 一个通用函数 接收任何实现了 Cloneable 自身的类型 // 注意这里的 T Cloneable[T] 以前这种递归引用是很难搞的 func Duplicate[T Cloneable[T]](item T T Cloneable[T]) T { return item.Clone() } func main() { d : MyData{Value: 100} d2 : Duplicate(d) println(d2.Value) }这对于写通用库 (Library) 的同学来说绝对是个大利好。代码的类型约束更严谨了不需要再用interface{}这种万能胶来凑数。性能与工具: 编译器优化除了语法糖 咱们再来看看那几个硬核的性能优化和新工具怎么体现在代码上。编译器栈分配优化Go 1.26 的编译器变得更聪明了。它能识别出更多 “不会逃逸” 的场景 把切片分配在栈上。func processData() int { // 以前: 这种动态 make 可能会导致切片逃逸到堆上 (Heap Allocation) // 导致 GC 压力增加 data : make([]byte 128) // 模拟一些操作 data[0] 1 return int(data[0]) }在 Go 1.26 中 编译器通过更深入的逃逸分析 发现data这个切片根本没有传到函数外面去 它就会直接在栈上 (Stack) 分配内存。这就意味着:函数返回 内存自动回收。0 GC 开销。强制内联指令以前我们想让一个函数内联 (Inline) 只能祈祷编译器心情好或者代码写得足够简单。现在有了//go:fix inline 我们可以显式建议编译器进行内联。配合新的工具链写法如下:package main //go:fix inline func FastAdd(a b int) int { return a b } func main() { // 在编译或使用 go fix 工具处理后 // 这里的调用会被展开 消除函数调用开销 x : FastAdd(10 20) println(x) }注意这里不仅是编译器优化go fix工具甚至会帮你分析哪些地方适合加上这个指令。实验性功能: SIMD 与安全这次还引入了几个实验性包虽然还没转正但已经可以用了。SIMD (单指令多数据)想做高性能计算的同学以前可能得去撸汇编。现在有了simd/archsimd(实验性)门槛低了很多。// 注意: 这是实验性包 需要通过 GOEXPERIMENT 开启或显式引用 import simd/archsimd func main() { // 假设有两个向量数据 var a, b archsimd.Float64x4 // 并行计算加法 // 底层直接对应 CPU 的 SIMD 指令 (如 AVX) result : archsimd.AddFloat64x4(a b) // ... }敏感数据清除做安全的同学最怕内存里残留密码。GC 什么时候回收是不确定的。runtime/secret允许我们手动销毁敏感数据。import runtime/secret func handlePassword(rawPwd []byte) { // 创建一个受保护的 secret 对象 s : secret.New(rawPwd) // 使用完后 显式销毁 // 确保内存中的数据被立即擦除 防止 core dump 泄露 defer s.Destroy() // 业务逻辑... }Goroutine 泄露分析最后是调试神器goroutineleak。配合 pprof 使用再也不用猜哪里泄露了。import ( runtime/pprof os ) func main() { // 运行一段时间后... f _ : os.Create(goroutine_leak.prof) // 获取专门的泄露 profile pprof.Lookup(goroutineleak).WriteTo(f 0) f.Close() // 然后用 go tool pprof 查看 }总结看完这些代码示例大家对 Go 1.26 是不是更有体感了?new(expr): 这种小甜点 用起来是真的顺手。泛型自引用: 解锁了更多高级设计模式。底层优化: 栈分配和内联控制 让我们的 Go 代码离 C/C 的性能又近了一步。实验性功能: 官方开始在 SIMD 和安全领域发力 未来可期。Go 1.26 已经可以在官网下载和使用了。建议可以先在一个小模块里试试水尤其是new的新写法估计以后会成为标准范式。GC 方面 Green Tea 也已经发力了这个新版本还是不错的。其他更多的 Go 1.26 的更新系列可以查看Go GC 重大改进Green Tea 性能提升 10-40%Go1.26 新特性pprof 终于支持分析 Goroutine 泄露了Go1.26 新特性机密模式 runtime/secret终于不用 Hack 代码了Go 1.26 新特性net.Dialer 终于支持 Context还做了性能优化Go1.26 新特性new(expr) 终于来了创建指针简单了Go1.26 新特性10年Goroutine 调度指标终于来了Go1.26 新特性errors.AsType 让错误处理更优雅了点Go1.26 新特性net/http 终于能手动管理连接了参考资料[1]Go 1.26 is released:https://go.dev/blog/go1.26关注和加煎鱼微信一手消息和知识拉你进技术交流群你好我是煎鱼出版过 Go 畅销书《Go 语言编程之旅》再到获得 GOPGo 领域最有观点专家荣誉点击蓝字查看我的出书之路。日常分享高质量文章输出 Go 面试、工作经验、架构设计加微信拉读者交流群和大家交流原创不易 点赞支持