Go语言冷知识:为什么 nil 也能调用函数?
Go 里的 `nil` 之所以有时能调用方法,关键不在“空值是否安全”,而在类型信息和调用方式。本文用指针接收者、接口值和会 `panic` 的反例,拆开说明 Go 编译器到底做了什么,以及哪些场景仍然不能掉以轻心。
Go 里的 `nil` 之所以有时能调用方法,关键不在“空值是否安全”,而在类型信息和调用方式。本文用指针接收者、接口值和会 `panic` 的反例,拆开说明 Go 编译器到底做了什么,以及哪些场景仍然不能掉以轻心。

Go 1.23 新增的 os.CopyFS,把“复制整个目录”带进了标准库。它适合替代很多基础场景下的第三方方案,但也有不覆盖已有文件、不处理符号链接等明确边界。本文结合签名、示例、实现思路和选型对比,帮你判断它是否适合当前项目。

在 Go 里,`container/list` 和切片都能表示线性数据,但它们解决的问题并不一样。本文从内存布局、操作复杂度和典型场景出发,说明链表什么时候值得上场,什么时候继续用切片更稳妥。 在 Go 里,`container/list` 常被拿来和切片比较,但这两者并不是简单的“谁更快”关系。

很多 Go 开发者熟悉 JSON、Protobuf,却很少认真评估标准库里的 `encoding/gob`。这篇文章从原理、基本用法、适用场景和常见限制四个方面梳理 `gob`,帮助你判断它是否适合纯 Go 项目的内部通信与数据持久化。 在 Go 项目里,一提到序列化,很多人先想到的都是 JSON 或 Protobuf ,标准库自带的 gob 往往反而被忽略。

这篇文章整理了在 CentOS 上搭建 Golang 运行环境的一套可直接照做的流程,涵盖系统更新、两种安装方式、环境变量配置、安装验证以及首个程序运行。文中同时补上 Go Modules 的常用做法和几个容易踩坑的细节,方便你判断该选哪种安装方案。

Go 里的 channel 并不是“创建后就该顺手 close”的资源。是否关闭,关键看它是否承担“不会再有数据”的通知职责:有接收方在等结束、要广播退出,或需要明确生命周期时应关闭;一次性通信、接收方视角和私有使用场景则通常不必关。

Go 1.18 引入的 `strings.Cut`,把“按第一个分隔符拆成两段”这件事做成了更直接的标准写法。相比 `SplitN`、`Index` 加切片,它在语义、边界处理和常见性能表现上都更适合配置解析、URL 拆分、标签处理这类场景。 在 Go 里,按分隔符拆字符串是最常见的基础操作之一,但很多代码仍停留在 SplitN 或 Index 加切片的写法上。

Go 泛型里的 `~int` 不是“放宽类型检查”,而是把约束扩展到“所有底层类型为 `int` 的类型”。这篇文章用可编译示例拆开它的作用、类型集合语义,以及 `~[]int` 这类场景里最容易踩的边界。 很多人第一次看到 Go 泛型里的 `~int`,都会把注意力放在那个波浪线上,却不太确定它到底改变了什么。

`strings.Compare()` 看起来像是 Go 提供的标准字符串比较入口,但标准库源码恰恰说明,它只是对 `==`、` ` 的一层封装。结合源码、字典序规则和适用场景来看,大多数业务代码直接用运算符会更清晰,也更快。

Go 项目的文档质量,往往直接体现在注释写法上。本文围绕 godoc/pkg.go.dev 的生成规则,整理包注释、函数注释、示例代码、弃用标记和本地预览方法,帮助你判断什么注释会真正进入文档、怎样写得清楚且便于协作。

这篇文章围绕 Go 游戏开发里的状态切换问题,梳理了状态机的基本概念、适用场景,以及用 `github.com/looplab/fsm` 落地的方式。重点不在概念堆砌,而在于说明什么时候该上状态机、Go 里通常怎么设计,以及回调机制能帮你把流程控制拆得更清楚。

Go 把 `++` 和 `--` 定义成语句而不是表达式,看上去像是少了点“灵活性”,本质上却是在主动规避歧义。理解这个设计后,你会更容易判断哪些写法在 Go 中合法,以及它为什么更强调可读性、求值顺序和团队协作中的一致性。
