技术博客与 Go 官方博客本周同时更新:一篇纠正关闭 channel 的常见误解并系统梳理并发机制,另一篇介绍 1.26/1.27 新增的跨平台 SIMD 实验 API,覆盖 amd64、arm64 和 wasm。
Antonz 的技术博客与 Go 官方博客本周分别更新了两篇内容:一篇是 Go 并发机制的速览小册子《Go concurrency distilled》,另一篇是 Go 官方博客介绍 1.26/1.27 新增的跨平台 SIMD 实验特性。
小册子开篇纠正一个常见误解:关闭 channel 并不等于释放它占用的资源。原文写道,关闭 channel 唯一的作用是告诉读取方所有数据都发完了;如果读取方不关心这件事,完全可以不关闭它——不管关没关,Go 的垃圾回收器都会回收其资源。这跟不少教程"用完记得关"的直觉相反。channel 只能被关闭一次,重复关闭或往已关闭的 channel 写数据都会直接 panic。
小册子系统梳理了 goroutine、channel、select、pipeline、time、context、wait group、data race、mutex、信号量、run once、对象池、atomic、调度和诊断等话题,每个都配可交互示例。几个细节:向 channel 发送值是同步操作,发送方阻塞直到有人接收;channel 可设置方向(只读、只写、双向),Go 会自动把普通 channel 转换成有方向的版本;带缓冲的 channel 表现得像 FIFO 队列,缓冲区有空间时写入不阻塞,有值时读取不阻塞。文中还提到 wg.Go(...):自动增加 wait group 计数器、在 goroutine 里运行函数、结束后自动减少计数器,比手写 Add/Done 更不容易漏配对。
SIMD 能让 CPU 用一条指令同时处理多组数据,比如一次给 8 对 float64 做加法,广泛用于加密、数据处理和 AI 计算——Go 官方博客提到,Go 自己的 Green Tea 垃圾回收器已在用 SIMD 加速内存扫描。此前 Go 里用 SIMD 唯一办法是手写汇编,只有最关键的计算核心才值得。Go 1.26 先给 amd64 加上 SIMD API,1.27 又补上 arm64(NEON)和 wasm。但不同平台差异很大:有的向量长度固定(wasm、PowerPC、s390x 为 128 位),有的支持多种固定长度(amd64 有 128/256/512 位),riscv64 支持 128 到 65536 位间任意 2 的幂次长度。为此 1.27 新增了一个实验性、跨平台、不区分向量大小的 simd 包,设计参考 C++ 的 Highway 库:只支持所有平台都有的操作交集,交集之外用其他 SIMD 指令模拟,即便平台没有 SIMD 硬件也能退化成软件模拟继续跑。启用方式是编译时设置 GOEXPERIMENT=simd。
受影响的主要是两类人:写高并发服务、需要弄清 channel/context/pipeline 机制细节的 Go 工程师;以及做数据处理、加密或推理计算、想压榨 CPU 向量化性能又不想手写汇编的团队。接下来值得关注的是这个 simd 包会不会在后续版本转正、操作交集会不会随反馈扩大,以及真实数据管线里模拟实现兜底的那部分性能能打几折。
免费获取企业 AI 成熟度诊断报告,发现转型机会








关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断