LIÚBÁI · 一门靠删减取胜的语言 · 写给做加法做腻了的人

留白.

G   O

你写了很多年做加法的语言。Java 一直加,Kotlin 加得更狠:继承、密封类、协程、扩展函数、DSL、重载、默认参数、空安全操作符…… 每加一样,你写一行代码的方式就多一种。

Go 反过来。它几乎把你依赖的每个特性都删掉了 —— 没有继承、没有异常、没有构造函数、没有方法重载、没有三元表达式、十年没有泛型,连循环都只剩一个 for。第一次写 Go,你会觉得它简陋得像在羞辱你

这本书想说服你:每一处「删掉」都是一个刻意的、有代价也有回报的设计决定。学 Go 不是学新东西,是一次「卸载」 —— 把 Kotlin 塞给你的每个反射一个个放下,看清哪些是编程的本质、哪些只是你那门语言的口音。而 Go 删到最后,只郑重地往你手里塞回一样东西:便宜到能同时开一万个的并发。

24
6
12个真引擎 Demo
2台会「算」的引擎:接口检查器 + 调度器

这本书是写给谁的

写给已经会用 Kotlin / Java(顺带会点 Python、JS)、现在要或想学 Go 的人 —— 大概率是你这样的 Android / 后端工程师。你不缺编程基础,缺的是有人把 Go 那些「怎么这么少」的地方,一条条对着你熟悉的语言讲清楚:它到底删了什么,为什么删,删了之后你该怎么写。

所以这本书不从「变量怎么声明」这种地方慢慢爬。它默认你知道什么是函数、闭包、接口、泛型、协程,然后专攻一件事:Go 和你脑子里那门语言,差在哪、为什么差。每一章的最后都有一节「Kotlin 对照」,把这一课接回你每天写的东西。

◆ 这本书的主线

你学 Go 卡壳,几乎从来不是因为某个概念太难,而是因为你的手比脑子快 —— 你的手指头想去按 Kotlin 的那个键。想写 try,Go 说没有;想写 class Dog : Animal,Go 说没有;想 user?.name,Go 说没有。

每一次「没有」,背后都站着一个 Go 团队做过的取舍。把这些取舍一个个看懂,你不只学会了 Go —— 你会开始分得清,你写了十年的那些「语言特性」,哪些是真的帮你把问题想清楚了,哪些只是让你更快地写出了以后没人看得懂的代码。

「真引擎 Demo」是什么意思

这本书里的 12 个 Demo,不是动画、不是示意图,是真的在你浏览器里跑的 Go 语义引擎。其中两台是招牌:

  • 接口满足检查器(第 9 章):你敲进一个 struct、几个方法、一个 interface,它真的去解析、算出值类型 T 和指针 *T 各自的方法集,判断谁满足接口 —— 并当场复现那个让无数人栽跟头的坑:方法用了指针接收者,值类型就不满足接口
  • goroutine 调度器(第 17 章):一台真的协作式调度器 + 真的 channel。你看 goroutine 一步步交错执行、无缓冲 channel 上的 send 卡住等 recv、缓冲填满、close 唤醒 —— 以及当所有 goroutine 都睡死时,它打印出和真 Go 运行时一字不差的 fatal error: all goroutines are asleep - deadlock!

正文里出现的每个数字(减法账本删了几项、切片扩容后 cap 变成几、这个类型满不满足那个接口),都是这些引擎当场算的,不是我写死的。

— 这本书要逐条审判的「你以为理所当然的东西」 —
继承 try / catch constructor 方法重载 默认参数 a ? b : c while getter / setter 运算符重载 ?. ?: !! sealed + when 扩展函数 data class suspend 染色 KSP / APT 泛型型变
在这 16 样里,Go 直接删掉 9 样换成完全不同做法的 6 样,只有泛型这 1 样算「你熟的东西它后来也补上了」。第 1 章的 Demo 会把这张账本交互地摆给你看。

这本书假设你已经会什么

写给这样的人

  • 能熟练写 Kotlin / Java(或 Swift / C#),也许还会点 Python、JS
  • 用过继承、接口、泛型、协程、异常,且默认它们「本该如此」
  • 要开始写 Go,或写过一点但觉得「怎么处处别扭」
  • 想要的是看懂它为什么这么设计,不是背 API

暂时不适合

  • 完全没写过代码 —— 这本书假设你有扎实的编程基础
  • 只想要「10 分钟速查语法表」(那种网上很多)
  • 要的是 Go 运行时 / GMP 调度器的底层源码级剖析(那是另一本书《同时》干的活,这里只讲「怎么写对」并链接过去)
  • 受不了「先承认你熟的做法,再讲 Go 为什么偏不那么做」这种叙事

读法

顺着读。六卷是有顺序的:卷 I 先讲清「Go 为什么长这样」和最基础的语法减法;卷 II 讲值、零值与内存(Go 默认复制,这颠覆你的引用直觉);卷 III 是全书的重头 —— 接口,Go 最不像 Kotlin 的地方,整整六章;卷 IV 讲「错误是值」;卷 V 是那件塞回你手里的礼物 —— 并发;卷 VI 讲工程化,并用最后一章给你一张从 Kotlin/Java 迁移的对照表送你上路。

每章末尾的「Kotlin 对照」是这本书的黏合剂。你不是从零开始 —— 你带着十年的直觉来。这本书的工作,是帮你把那些直觉,一部分接过来、一部分放下去。