Go语言技术文章
-
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 收藏 -
Go 的 http.Header 是 map[string][]string,直接赋值或只复制 map 仍可能共享值切片。本文从旧写法的串改问题出发,说明 Header.Clone 的隔离语义、nil 与多值边界,以及从手写复制迁移到 Go 1.13+ 标准方法的检查清单。306 收藏 -
Go 中 error 是接口类型。本文解释为什么底层 *MyError 为 nil 时,返回的 error 仍可能让 err != nil 成立,并给出返回边界的修复与测试写法。348 收藏 -
Go 配置中的 500ms、2s 和 1m30s 不能按普通整数读取。本文用 time.ParseDuration 拆开格式边界、错误处理、负数与溢出问题,并给出启动阶段集中校验的写法。432 收藏 -
CGO_ENABLED=0 会让 cgo 构建约束失效。本文从环境确认、文件筛选到纯 Go 实现配对,说明如何定位“找不到实现”并稳定检查两条构建分支。329 收藏 -
Go build tags 选错实现文件时,先确认 GOOS、GOARCH、CGO_ENABLED,再用 go list 对照 GoFiles 与 IgnoredGoFiles,最后检查文件名后缀、//go:build 表达式和 -tags 参数是否一致。496 收藏 -
Go 下载依赖卡在 sum.golang.org 时,先区分模块代理和校验数据库的网络边界,再按公共模块、私有模块或内网代理选择 GOPROXY、GOSUMDB、GOPRIVATE 与 GONOSUMDB,避免用全局关闭校验掩盖配置问题。290 收藏