留白.
你写了很多年做加法的语言。Java 一直加,Kotlin 加得更狠:继承、密封类、协程、扩展函数、DSL、重载、默认参数、空安全操作符…… 每加一样,你写一行代码的方式就多一种。
Go 反过来。它几乎把你依赖的每个特性都删掉了 —— 没有继承、没有异常、没有构造函数、没有方法重载、没有三元表达式、十年没有泛型,连循环都只剩一个 for。第一次写 Go,你会觉得它简陋得像在羞辱你。
这本书想说服你:每一处「删掉」都是一个刻意的、有代价也有回报的设计决定。学 Go 不是学新东西,是一次「卸载」 —— 把 Kotlin 塞给你的每个反射一个个放下,看清哪些是编程的本质、哪些只是你那门语言的口音。而 Go 删到最后,只郑重地往你手里塞回一样东西:便宜到能同时开一万个的并发。
这本书是写给谁的
写给已经会用 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 变成几、这个类型满不满足那个接口),都是这些引擎当场算的,不是我写死的。
这本书假设你已经会什么
写给这样的人
- 能熟练写 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 对照」是这本书的黏合剂。你不是从零开始 —— 你带着十年的直觉来。这本书的工作,是帮你把那些直觉,一部分接过来、一部分放下去。