Go语言冷知识:为什么 nil 也能调用函数?

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

Go语言冷知识:为什么 nil 也能调用函数?

Go 1.23 的 os.CopyFS:目录复制终于有了标准库方案

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

Go 1.23 的 os.CopyFS:目录复制终于有了标准库方案

Go 语言中何时该用 `container/list` 而非切片?

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

Go 语言中何时该用 `container/list` 而非切片?

Go 标准库里的 gob,为什么常被忽略却仍值得用

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

Go 标准库里的 gob,为什么常被忽略却仍值得用

Go 语言中的 channel 到底需不需要关闭?

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

Go 语言中的 channel 到底需不需要关闭?

化繁为简:Go 语言 strings.Cut 的优雅实践

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

化繁为简:Go 语言 strings.Cut 的优雅实践

Go 里的 `~int` 到底是什么意思?从底层类型到泛型约束一次讲清

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

Go 里的 `~int` 到底是什么意思?从底层类型到泛型约束一次讲清

我用 Go 做游戏开发时,状态机是怎么实现的?

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

我用 Go 做游戏开发时,状态机是怎么实现的?

为什么 Go 语言中 `++/--` 不是表达式而是语句?

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

为什么 Go 语言中 `++/--` 不是表达式而是语句?