Go 语言中条件编译的最佳实践

Go 的条件编译并不复杂,但真正容易踩坑的地方,往往是标签写法、文件命名规则,以及何时该用运行时判断。本文按跨平台开发的实际场景梳理 Go 的几种做法,并补出适用边界和常见错误。

Go 语言中条件编译的最佳实践

Go map面试必看:日期格式化输错一个数字会怎样?

Go 的时间格式化不靠 `yyyy-MM-dd` 这类占位符,而是直接用参考时间 `Mon Jan 2 15:04:05 MST 2006`。这让格式写法很直观,但也意味着一旦数字写错,`Format` 依然会照常输出,结果往往比报错更难排查。 在 Go 项目里,时间格式化常常看起来只是一个小细节,但它恰好是最容易把线上数据悄悄写坏的地方。

Go map面试必看:日期格式化输错一个数字会怎样?

提升 Go 代码质量的 Lint 工具,应该怎么选和搭配?

Go 生态里的 lint 工具很多,但并不是装得越多越好。本文按“官方基础、主力整合、专项检查、落地配置”四个层次梳理常用工具,保留安装命令、典型配置和适用场景,帮助你判断个人项目、团队协作和 CI 流程里该怎么选。

提升 Go 代码质量的 Lint 工具,应该怎么选和搭配?

Go 语言错误包装的实用写法:从 `%w` 到错误链最佳实践

Go 1.13 引入的错误包装,解决了传统错误信息只剩一句话、排查时难以定位源头的问题。本文围绕 `%w`、`errors.Is`、`errors.As`、`errors.Unwrap` 和自定义错误类型,整理一套更适合实际项目落地的写法与判断标准。 在 Go 项目里,错误处理往往不是“有没有报错”这么简单,真正麻烦的是线上只留下一句模糊提示,定位时却找不到触发路径。

Go 语言错误包装的实用写法:从 `%w` 到错误链最佳实践

Go 代码格式化该用 gofmt 还是 goimports?一文讲清选择与集成方式

在 Go 项目里,`gofmt` 只能处理代码排版,而 `goimports` 还会接手 import 的增删、合并和分组。本文从两者差异、命令用法到编辑器、Git 钩子和 CI 集成,梳理一套更省心的落地方式。 写 Go 时,最常见却也最打断节奏的,往往不是业务逻辑本身,而是没删干净的 import、漏写的依赖和反复手动整理的格式问题。

Go 代码格式化该用 gofmt 还是 goimports?一文讲清选择与集成方式

从 for i := 0 到 range n:Go 循环语法的进化指南

Go 1.22 新增了对整数直接使用 `range` 的写法,让固定次数循环不必再写完整的三段式 `for`。这篇文章会把它与旧写法放在一起说明,讲清语法规则、适用场景和边界,帮助你判断哪些计数循环适合直接改写。

从 for i := 0 到 range n:Go 循环语法的进化指南

Go 代码的进化美学:errors.AsType 错误处理新范式

Go 1.26 新增的 `errors.AsType`,把错误类型提取从“先声明变量再判断”压缩成一行,同时保留了 `errors.As` 的错误链遍历能力。它的价值不只是少写几行代码,更在于缩小变量作用域、让多类型分支判断更顺手,但前提是类型参数必须和错误链中的实际存储类型一致。

Go 代码的进化美学:errors.AsType 错误处理新范式

Go 代码的进化美学:`wg.Go()` 方法让你少写一个 BUG

Go 1.25 为 `sync.WaitGroup` 增加了 `Go()` 方法,把常见的 `Add(1)`、`defer Done()` 模板收进标准库。这个改动不大,却直接减少遗漏同步调用的常见错误,也让并发代码的意图更容易被读懂。 在 Go 的并发开发里,`sync.WaitGroup` 很常用,但那段 `Add(1)`、`defer Done()` 的固定模板也几乎人人都写烦过。

Go 代码的进化美学:`wg.Go()` 方法让你少写一个 BUG

别再只用 omitempty 了:Go 1.24 的 omitzero 让 JSON 序列化更精确

Go 1.24 为 `encoding/json` 增加了 `omitzero` 标签,用来按“零值”而不是“空值”决定字段是否序列化。它解决了 `time.Time` 零值总被输出、`nil` 切片与空切片无法区分,以及自定义类型缺少忽略规则等老问题。 在 Go 项目里,很多人已经把 `omitempty` 用成了默认配置,但一到 `time.Time`、空切片和自定义类型这些细一点的场景,序列化结果就常常不如预期。

别再只用 omitempty 了:Go 1.24 的 omitzero 让 JSON 序列化更精确

Go 三元运算符的替代者:cmp.Or 让默认值写法更清晰

Go 1.22 新增的 `cmp.Or`,给“值为空时取默认值”这类常见需求提供了更紧凑的写法。它能减少重复的 `if-else`,但前提是你要真正理解“零值”规则、类型限制,以及哪些场景不该直接套用。 Go 一直没有三元运算符,所以“值为空就给默认值”这种高频逻辑,过去往往只能靠一层层 if-else 来写。

Go 三元运算符的替代者:cmp.Or 让默认值写法更清晰