Go语言技术文章
-
Go 中把 range 变量直接交给 goroutine 闭包,常会让多个异步任务读到同一个值。本文用可复现代码拆开捕获时机、参数传递和验收方法,给出适合生产代码的修复边界。273 收藏 -
Go 的 encoding/json 默认会忽略结构体没有定义的 JSON 字段。本文说明如何用 Decoder.DisallowUnknownFields 严格拒绝多余字段,并把它安全接入 HTTP 接口。273 收藏 -
Go 的 testing.T.Setenv 会修改整个测试进程的环境,并用 Cleanup 恢复原值,因此不能用于并行测试或有并行祖先的测试。本文解释冲突原因,并给出串行设置、依赖注入和子进程隔离的选择方法。273 收藏 -
Go 结构体一旦包含 sync.Mutex,就不能把它当普通值随意复制。本文用共享 map 的例子说明值接收者和 b := a 为什么会让两份锁保护同一份数据,并给出指针接收者、显式 Clone 与 go vet 检查方法。273 收藏 -
Go 的 cgo 文件能否被识别,取决于 CGO_ENABLED、import C、同包目录、GOOS/GOARCH 和 go:build 约束。本文用 go list -json 查看 CgoFiles、CFiles 与 IgnoredGoFiles,定位文件未参与构建的具体层级。273 收藏 -
本文用 filepath.IsLocal、filepath.Clean、filepath.Join 和 filepath.Rel 处理 Go 用户路径,说明词法规范化、固定根目录拼接与符号链接安全检查的边界。273 收藏 -
Go weak.Pointer.Value 返回 nil 不代表指针损坏,而是弱缓存对象已经不可达。本文用并发安全的缓存示例说明如何判断失效、回源重建、回填弱引用,并解释 GC 与 KeepAlive 的边界。273 收藏 -
json.Unmarshal 解码到 interface{} 或 map[string]any 时,JSON number 默认会落为 float64,可能让大整数标识失去精度。本文对比强类型字段、Decoder.UseNumber 和字符串 ID 三种方案,给出错误处理与安全复查清单。273 收藏 -
Go fuzz 失败语料只有在环境可重建时才真正可复现。本文把 time.Now 与包级随机函数改成可注入时钟和局部随机源,并将时刻偏移、随机种子纳入语料。273 收藏 -
解释 Go 1.24 的 testing.B.Loop 如何自动划定基准计时边界,把初始化和清理排除在循环体耗时之外,并对比传统 b.N 写法的迁移注意事项。273 收藏 -
Go 的 flag.FlagSet 通过 ContinueOnError 把参数解析失败交给调用方处理。本文比较三种 ErrorHandling 策略,并给出可复用、可测试的解析函数写法。273 收藏 -
Go build -ldflags 传入带空格的 -X 参数,需要同时保留 shell 实参和 Go 内层赋值字段。本文给出完整赋值加引号的最小写法、受控构建标签示例,以及变量路径、输入范围与发布日志的检查要点。273 收藏 -
Go JSON 流式解码末尾等待,常因混淆容器结束和 Reader EOF。本文用原创数组与连续值示例解释 More、Token、写端关闭、截断错误和读取截止时间。273 收藏 -
围绕 Go strings.Builder 的 Len、Cap 与 Grow,说明如何按 UTF-8 字节数预估容量、减少可预见的重复扩容,并处理动态字段、负数 Grow 与 Builder 复制边界。273 收藏 -
Go net/http.Request.CookiesNamed 可以按名称返回请求中的多个同名 Cookie。本文用最小代码说明它与 Cookie、Cookies 的区别、空结果处理和服务端排障边界。273 收藏