Go语言技术文章
-
Go 的 slice 不能直接作为 map key,因为 slice 不支持完整的 == 比较。本文用 string、定长数组和可比较 struct 给出按内容与复合条件建索引的替代方案,并说明 any、泛型和长度边界。280 收藏 -
Go map 的 range 顺序本来就不保证稳定,测试直接比较遍历结果就会偶发失败。本文用一个小型测试工具拆开集合断言与顺序断言,让 map 测试稳定且不掩盖真实数据错误。353 收藏 -
Go encoding/json 的 omitempty 不会自动按自定义 IsZero 省略结构体字段。应使用 omitzero,并区分未提供、显式零和有效值;组合标签按空或零任一条件省略。384 收藏 -
解释 Go io.MultiWriter 按顺序写入多个 Writer 的行为,区分错误、短写入和部分结果,并给出失败后的重试与补偿判断方法。434 收藏 -
Go Ticker Reset 后仍收到旧节拍,通常不是 Reset 没生效,而是 Go 版本、计时器通道语义和消费协程时序叠在了一起。本文给出判断边界与兼容写法。173 收藏 -
讲清 Go netip.AddrFromSlice 对 4 字节、16 字节和非法长度的处理,并说明 IPv4-mapped IPv6、Is4In6 与 Unmap 的转换边界。282 收藏 -
Go 错误被 fmt.Errorf 包装后,直接比较往往失效。本文用错误树说明 errors.Is 的匹配规则、%w 包装、哨兵错误和自定义 Is 方法的边界。208 收藏 -
Go range 遍历 nil channel 会一直阻塞。通过入口检查、初始化遮蔽排查和通道状态区分定位原因,再为接收接口约定关闭责任、空结果和取消方式。107 收藏 -
Go 中 select 搭配 default 会把等待变成立即返回;如果外层再套无限循环,就可能形成忙循环并持续占用 CPU。本文从定位、阻塞等待、定时退避、退出信号和运行指标五个角度给出修正写法。168 收藏 -
Go WaitGroup 的正向 Add 在计数器为零时必须先于 Wait;把 Add 放进新 goroutine 会让 Wait 可能提前返回,甚至触发并发误用。本文用任务登记、风险路径和审查清单说明可靠写法。303 收藏 -
Go 数据竞争测试偶现失败时,可从具体包和测试名缩小范围,成对分析 race 访问栈定位共享对象,再统一加锁或隔离状态,并保留并发回归测试。335 收藏 -
Go 普通 map 发生并发读写时可能直接触发 concurrent map read and map write。本文按排障顺序说明如何确认写入边界、用 RWMutex 修复,以及什么时候才适合换成 sync.Map。375 收藏 -
recover 只能恢复当前 goroutine 正在展开的 panic。本文用调用栈边界解释父 goroutine 为什么接不住子 goroutine,并给出 worker 包装器、错误回传和资源清理的实现方式。353 收藏 -
Go flag 包中,解析后的变量值不能单独证明参数是否由用户传入。本文用 Visit 和 NFlag 判断实际设置项,再处理显式空字符串、布尔参数、默认值与配置合并的边界。175 收藏 -
解释 Go defer 直接参数与闭包读取的差异,结合 Go 1.22 循环变量语义,给出显式传参和小函数隔离生命周期的写法。475 收藏