知道 Go 语言中的 ast 包可以做什么吗?

Go 的 `go/ast` 包并不只服务编译器,它也是 `gofmt`、静态检查、代码生成和文档提取等工具的基础。本文从 AST 是什么讲起,再结合遍历示例、典型用途和使用注意点,帮你判断它适合拿来做哪些自动化工作。

知道 Go 语言中的 ast 包可以做什么吗?

Go 语言面试陷阱:浮点数能用 `|` 进行位运算吗?

这道 Go 面试题的关键不在计算结果,而在类型规则:`float64` 不能使用 `|` 这类位运算符,代码会直接编译失败。文章从报错出发,解释 Go 为什么把位运算限定在整数类型,并补充浮点数的正确处理方式与需要操作位表示时的标准做法。

Go 语言面试陷阱:浮点数能用 `|` 进行位运算吗?

Go 语言中空 `struct{}` 占多少空间?

Go 里的 `struct{}` 常被称为“零大小类型”,但它为什么几乎不占空间、什么时候真能省内存、又有哪些边界条件,很多人并不清楚。本文从 `unsafe.Sizeof` 验证、`zerobase` 机制,到 Set、信号通道和无状态接收器等常见写法,系统说明空结构体该怎么用、哪里要谨慎。

Go 语言中空 `struct{}` 占多少空间?

Go Modules 时代,GOPATH 还有哪些不可替代的作用?

Go Modules 已经取代 GOPATH 成为 Go 项目的默认依赖管理方式,但这并不意味着 GOPATH 失去意义。本文从工作区历史、Modules 带来的变化、GOPATH 在工具安装与模块缓存中的现职,以及多 GOPATH 与环境配置建议几个角度,梳理它在现代 Go 开发中仍然保留的实际价值。

Go Modules 时代,GOPATH 还有哪些不可替代的作用?

Go 语言中关闭的 channel 还能读数据吗?

Go 中关闭 channel 后仍然可以读,但读到什么取决于缓冲区是否还有未消费数据。本文用一段简单实验解释关闭后的读取规则、`ok` 判断方式,以及缓冲与无缓冲 channel 的差异,顺带梳理实际开发里更稳妥的关闭习惯。

Go 语言中关闭的 channel 还能读数据吗?

Go 语言中为什么不能直接对 map 元素取地址?

Go 不允许直接对 map 元素取地址,这不是语法上的任性限制,而是为了避免元素在扩容、重哈希后地址变化带来的悬空指针。理解这一点后,就能更稳妥地选择“取出-修改-存回”或指针类型 map,并避开 range 遍历时的取址陷阱。

Go 语言中为什么不能直接对 map 元素取地址?

Go 语言中如何比较两个 map 是否相等?

Go 里的 map 不能像普通值那样直接用 `==` 比较,这一点经常在写判断逻辑时踩坑。本文从原因入手,梳理逐项比对与 `reflect.DeepEqual` 两种常见做法,再结合性能、类型差异和 `nil map` 等细节,帮助你判断什么时候该自己写比较函数,什么时候适合直接用标准库。

Go 语言中如何比较两个 map 是否相等?

Go 语言中 bufio.Scanner 的最佳实践

在 Go 里处理文本输入时,`bufio.Scanner` 常被当作“逐行读取工具”使用,但它真正的价值不止于此。本文从为什么要选它、基础用法、缓冲区限制到实际场景与性能取舍,梳理一套更适合工程实践的使用方法。

Go 语言中 bufio.Scanner 的最佳实践

Go 语言里的 sync.OnceValue:把懒加载写得更直接

Go 1.21 新增的 sync.OnceValue,把“只执行一次”和“结果缓存”合成了一个更顺手的接口。它适合配置加载、连接初始化和昂贵计算这类懒加载场景,但在 panic 传播和失败重试策略上,和传统 sync.Once 仍有明显差异。

Go 语言里的 sync.OnceValue:把懒加载写得更直接

Go 语言中的 //export:怎样把 Go 函数交给 C 调用

`//export` 是 Go 提供给 C 调用 Go 函数的一条关键通道,但它并不是写个注释就结束。本文用一个最小可运行示例,说明它的语法要求、编译方式、C 侧调用方法,以及内存、类型和平台相关的几个边界条件。

Go 语言中的 //export:怎样把 Go 函数交给 C 调用

别再误会了:Go 里的 go.sum 其实不是锁文件

很多 Go 开发者会把 go.sum 误认成 package-lock.json 一类的锁文件,但它并不参与版本解析。真正需要厘清的是:go.mod 负责依赖版本与构建选择,go.sum 负责校验依赖内容是否被篡改,两者分工完全不同。 不少 Go 开发者都会把 go.sum 顺手理解成锁文件,但这恰好会把 Go 模块系统里最关键的职责分工看反。

别再误会了:Go 里的 go.sum 其实不是锁文件