Go 语言 map 的 key 类型避坑:哪些能用,哪些一开始就不该用

Go 的 map 并不是“什么类型都能当 key”。判断标准只有一个核心:这个类型必须可比较,能参与 == 和 !=。本文按可用、不可用和常见陷阱三部分拆开讲清,顺带给出 struct、interface、slice 替代方案等实用判断方法。 在 Go 里写 map 时,很多人并不是一开始就搞清楚 key 的限制,而是在编译报错或运行时 panic 后才回头排查。

Go 语言 map 的 key 类型避坑:哪些能用,哪些一开始就不该用

Go 构建时注入版本号实战:不用第三方包,也能把版本信息做完整

给 Go 程序加上可查询的版本号,不一定要引入第三方库。本文用标准库配合 `go build -ldflags`,演示如何在构建阶段注入版本号、构建时间和 Git 提交,并进一步补上 JSON 输出与 Makefile 自动化构建。 线上排查 Go 程序时,最常见的问题不是服务起不来,而是程序已经在跑,却说不清自己来自哪次构建。

Go 构建时注入版本号实战:不用第三方包,也能把版本信息做完整

Go 语言 httptest 实战:让 HTTP 测试更简单

Go 标准库里的 `httptest`,解决了 HTTP 测试里最麻烦的几件事:起服务、占端口、清理资源,以及难以稳定复现异常场景。本文按处理器测试、客户端测试和常见进阶场景展开,结合可直接运行的示例,帮助你判断该用 `NewRecorder` 还是 `NewServer`。

Go 语言 httptest 实战:让 HTTP 测试更简单

Go 字符串遍历为什么 `range` 能打印汉字,`len` 索引却会乱码

同样是遍历 Go 字符串,`range` 能正常输出汉字,而基于 `len` 的索引循环却可能打印出乱码,关键差别不在“循环写法”,而在 Go 对字符串的底层定义。本文从 UTF-8、`byte`/`rune` 和常见处理方式三层展开,帮你判断什么时候该按字节处理,什么时候必须按字符处理。

Go 字符串遍历为什么 `range` 能打印汉字,`len` 索引却会乱码