Go语言技术文章
-
Go 方法表达式 T.M 与方法值 x.M 的差别不在语法表面,而在接收者何时绑定。本文用值接收者和指针接收者示例说明函数类型、状态变化与回调选择。370 收藏 -
maps.Copy 只负责把源 map 的键值写入目标 map,不会替 nil 目标分配存储。本文解释 nil map 的读写边界、make 初始化方式,以及函数内初始化后如何返回可写 map。108 收藏 -
Go 空接口断言失败通常不是值看起来不对,而是动态类型与目标类型不完全一致。本文用 %T、comma-ok、类型 switch 区分值类型、指针类型和 typed nil。432 收藏 -
Go 1.23 的 maps.Keys 返回 iter.Seq 而不是切片。本文演示如何用计数和 break 获取任意前 N 个键,何时必须排序保证稳定顺序,以及如何封装可组合的 Take 迭代器。364 收藏 -
Golang · Go问答 | 5小时前 | 接口 · Go问答 · 类型比较 · 运行时panic · 动态类型 reflect.Value.Comparable Go接口比较 interface panic
Go 接口类型本身支持比较,但接口里的动态值如果是 slice、map、func,或包含这些字段的数组和结构体,比较相同动态类型的两个接口就可能触发 panic。本文说明判断边界,并给出 reflect.Value.Comparable、reflect.DeepEqual 和类型化比较的选择方法。481 收藏 -
Go slices.Clip 会把切片容量收紧到长度,但不会复制元素或立即释放底层数组。本文从三索引切片、append 隔离、长期持有和 Clone 对比四个场景说明什么时候值得调用。263 收藏 -
Golang · Go问答 | 5小时前 | defer · Go问答 · 代码排查 · 函数返回值 · 命名返回值 Go defer 显式 return 返回值覆盖 named return values
Go defer 会不会覆盖显式 return,关键不在 return 写没写值,而在 defer 是否能访问函数的命名结果参数。本文用执行顺序、闭包捕获和 defer 参数求值三个角度拆开这个常见误区。485 收藏 -
讲清 Go slices.Delete 删除后 len、cap、尾部清零和底层数组持有之间的区别,并给出 Delete、Clip 与复制收缩的选择方法。241 收藏 -
Go defer 不是把整条语句留到函数结束才解释:函数值和参数在登记时求值,真正调用在返回前发生。本文拆开值参数、闭包和命名返回值的时机差异。120 收藏 -
Go strings.Builder 调用 String 后仍然可以继续写入。本文结合 String、WriteString、Reset、Grow 和非零 Builder 不可复制的限制,说明如何安全复用 Builder。158 收藏 -
Golang · Go问答 | 6小时前 | 并发 · go · atomic.Pointer · 状态设计 · Go atomic.Pointer atomic.Pointer Load Go nil状态
Go atomic.Pointer 的 Load 返回 nil,只能说明当前没有对象,不能区分零值未初始化和曾有对象后被 Store(nil) 清空。本文用额外状态位和 CAS 说明如何设计可判断的生命周期状态。250 收藏 -
复用 bytes.Buffer 时,旧数据残留通常是因为写入会追加而不是覆盖。本文用 Len、Cap、Reset 和 Grow 拆开逻辑长度、底层容量与切片别名,给出循环复用、容量阈值和返回值复制的处理方式。441 收藏 -
atomic.Value 的 Store 参数虽然是 any,但同一个 Value 首次写入后就锁定具体类型。本文用最小复现定位值类型、指针类型和 nil 导致的 panic,并给出稳定快照的修复写法。145 收藏 -
Go io.MultiWriter 会按顺序把同一份数据写入多个 Writer,遇到首个错误或短写就停止,不能把多目标写入当成事务;本文用示例说明如何识别部分成功并设计补偿策略。372 收藏 -
Go sync.Pool 的 Get 不保证返回刚 Put 的对象,池内元素也可能被自动移除。本文用最小代码说明 Get、Put、New 的边界,并给出复用临时对象时的排查清单。336 收藏