Go语言技术文章
-
Go test 输出 cached 并不等于测试失效,而是成功的包测试结果被复用。本文说明如何用 -count=1 强制重跑、用 -run 和 -v 定位目标,以及何时使用 go clean -testcache。496 收藏 -
用 go/format.Source 格式化模板生成的 Go 源代码,处理完整文件与代码片段的差异,再在成功后写入文件,并说明固定 gofmt 版本的稳定性边界。109 收藏 -
Go 的 testing.T.Setenv 会修改整个测试进程的环境,并用 Cleanup 恢复原值,因此不能用于并行测试或有并行祖先的测试。本文解释冲突原因,并给出串行设置、依赖注入和子进程隔离的选择方法。273 收藏 -
用 Go 标准库解析源码,遍历 ast.FuncDecl,列出普通函数和方法的名称、参数签名与源码行号,并处理多名参数、无名参数、可变参数等常见 AST 边界。119 收藏 -
Go 中 nil 切片和空切片的 len 都是 0,但 reflect.DeepEqual 会因为 nil 状态不同返回 false。本文用最小示例解释原因,并比较 DeepEqual、slices.Equal 与规范化写法的适用边界。449 收藏 -
用 go generate 把源定义、生成器和重复 Go 代码连接起来,掌握指令格式、生成文件标记、执行检查与失败回滚。136 收藏 -
Go reflect.Set 报值不能修改,通常不是 Set 本身有问题,而是 Value 不可寻址或来自未导出字段。本文用结构体字段示例说明 ValueOf、Elem、CanSet 和安全写入函数的关系。303 收藏 -
通过 go mod vendor 生成 vendor 与 vendor/modules.txt,在断网构建机用 GOPROXY=off 和 -mod=vendor 完成 Go 项目的离线构建,并处理 go.mod 与 vendor 不一致问题。258 收藏 -
Go 泛型约束中的 int 只匹配精确的 int 类型,~int 才会接纳底层类型为 int 的命名类型。本文用最小代码和类型集合说明两者差异。441 收藏 -
用 Go 的 go build -ldflags -X 在编译时注入版本号、Git 提交号和构建时间,并说明 buildvcs 元数据的读取边界。358 收藏 -
Go 泛型函数的类型推导主要依赖调用实参与函数形参之间的类型关系,不能根据接收返回值的变量类型倒推。本文用无参数泛型工厂说明失败原因,并给出显式类型实参和增加 typed 参数两种 API 设计方案。241 收藏 -
Go 可以用文件名后缀和 //go:build 条件编译为 Windows、Linux 提供不同实现。本文用一个跨平台文件权限接口说明目录组织、构建标签、文件选择检查和常见坑。438 收藏 -
Go 接口值用 == 比较并不总是安全:当两个接口装着相同的切片、map 或函数类型时,比较会在运行时 panic。本文用最小示例说明原因,并给出动态类型检查与按业务语义比较的写法。378 收藏 -
用 go test 生成 Go 测试覆盖率文件,再用 go tool cover 按函数和语句定位未覆盖代码,并说明多包与集成测试的 covdata 边界。113 收藏 -
Go 1.21 改变了 panic(nil) 与 recover 的返回语义。本文解释默认行为、旧模块兼容开关,以及如何用非 nil 哨兵稳定判断 panic。422 收藏