Twitch工程师的Go进阶之路:为何你写的Go代码,总感觉“不对劲”?

本文永久链接 – https://tonybai.com/2025/07/04/everything-i-did-to-become-an-expert-in-golang

大家好,我是Tony Bai。

你是否也有过这样的时刻?

你已经用 Go 写了不少代码,项目也能跑起来,但内心深处总有一种挥之不去的“别扭感”。你写的 Go 代码,看起来更像是“带有 Go 语法的 Java/Python”,充斥着你从旧语言带来的思维习惯。代码或许能工作,但它不优雅,不简洁,总感觉“不对劲”。

最近,Twitch 的一位资深机器学习工程师 Melkey 分享了他从 Go 小白成长为生产级系统开发者的心路历程。他的故事,完美地诠释了如何突破这个瓶颈,完成从“会写”到“写好”Go 的关键一跃。

在这篇文章中,我们就来解读一下这位工程师的Go专家之路,看看从中可以借鉴到哪些有意义的方法。

从“被迫营业”到“感觉不对”的困境

和许多人一样,Melkey 开始学习 Go 并非出于热爱,而是因为工作的“逼迫”。2021年,当他以初级工程师的身份加入 Twitch 时,他还是一个习惯于用 Python 写脚本的“简单小子”,对 Go 一无所知。为了保住这份改变人生的工作,他别无选择,只能硬着头皮学下去。

很快,他熟悉了指针、静态类型和 Go 的基本语法。但问题也随之而来:他感觉自己的 Go 水平停滞不前,写出的代码“干巴巴的”,缺乏神韵。 他只是在完成任务,却丝毫没有感受到这门语言的魅力,更谈不上建立起真正的理解和喜爱。

这正是许多 Gopher,尤其是从其他语言转来的开发者,都会遇到的困境:我们只是在用 Go 的语法,实现其他语言的逻辑。 我们还没有真正进入 Go 的世界。

“顿悟”时刻:《Effective Go》带来的思维重塑

改变发生在 Melkey 偶然读到 Go 官方文档中的一篇文章——Effective Go 的那一刻。这篇文章里的几段话,像一道闪电,瞬间击穿了他的迷茫:

“A straightforward translation of a C++ or Java program into Go is unlikely to produce a satisfactory result—Java programs are written in Java, not Go.

In other words, to write Go well, it’s important to understand its properties and idioms. It’s also important to know the established conventions for programming in Go… so that programs you write will be easy for other Go programmers to understand.”

这段话的核心思想振聋发聩:将 C++ 或 Java 程序直接翻译成 Go,不可能得到令人满意的结果。要想写好 Go,就必须理解它的特性和惯用法。

Melkey 恍然大悟:他之前所做的,正是这种“直接翻译”的笨拙工作。他缺少的,是一次彻底的“思维重塑”——停止用过去的经验来套用 Go,而是开始真正地用 Go 的思维方式去思考问题。

什么是“Go 的思维方式”?

那么,这种听起来有些玄乎的“Go 思维”究竟是什么?它不是什么神秘的魔法,而是植根于 Go 语言设计中的一系列核心哲学:

1. 崇尚简洁与可读性

Go 厌恶“魔法”。它倾向于用清晰、直白、甚至略显“笨拙”的代码,来换取长期的可读性和可维护性。相比于某些语言中炫技式的语法糖和复杂的隐式行为,Go 鼓励你把事情的来龙去脉写得一清二楚。

2. 组合优于继承

Go 没有类和继承。它通过接口(interface)实现多态,通过结构体嵌入(struct embedding)实现组合。这种方式鼓励开发者构建小而专注的组件,然后像搭乐高一样将它们组合起来,而不是构建庞大而僵硬的继承树。

3. 显式错误处理

if err != nil 是 Go 中最常见也最富争议的代码。但它恰恰体现了 Go 的哲学:错误是程序中正常且重要的一部分,必须被显式地处理,而不是通过 try-catch 这样的语法结构被隐藏起来。它强迫你直面每一个可能出错的地方。

4. 并发是语言的一等公民

Goroutine 和 Channel 不仅仅是两个原生语法元素,它们是一种构建程序的新范式。正如 Rob Pike 所言,“并发不是并行”。Go 鼓励你从设计的源头,就把程序看作是一组通过通信来协作的、独立的并发单元,而不是在写完一堆顺序代码后,再思考如何用线程池去“并行化”它。

从理论到实践:用项目和资源内化新思维

当然,仅仅理解了这些哲学还远远不够。Melkey 强调,在读完所有文档后,他意识到“阅读所能做的就这么多了”,必须将新学到的思想付诸实践。

理论的顿悟,必须通过刻意的项目练习来巩固和内化。下面,就是他亲身走过的、从入门到精通的“四步实战路径”,以及在这条路上为他保驾护航的“精选资源清单”。

一条清晰的实战路径:用四类项目锤炼 Go 思维

  • 第一站:HTTP 服务 (从简单到复杂)

这是 Go 最核心的应用场景,也是梦开始的地方。从最基础的 CRUD、健康检查 API 入手,逐步深入到 OAuth 认证、自定义中间件、利用 context 包进行请求范围内的值传递等。这个过程能让你全面掌握构建生产级 Web 后端所需的各项技能。

  • 第二站:CLI 工具

许多优秀的 Go 开源项目,如 Docker、Kubectl,都是强大的 CLI 工具。通过使用 Cobra、Bubble T 等流行库,去构建自己的命令行应用,你会深刻理解 Go 作为“云原生时代的 C 语言”的工具属性,并学会如何优雅地处理命令行参数、标志和应用状态。

  • 第三站:gRPC 服务

当你感觉 HTTP 服务已驾轻就熟时,就该迈向微服务了。学习 gRPC 和 Protocol Buffers,构建服务间的通信。这将迫使你的思维从处理“用户-服务器”交互,转变为处理“服务-服务”间的交互,是成为分布式系统架构师的关键一步。

  • 第四站:管道作业与脚本

真正的精通,是把一门语言用成“肌肉记忆”。尝试用 Go 替代你过去的脚本语言(如 Python),去编写一些数据处理的管道作业或日常运维脚本,比如批量清洗数据库中的脏数据。这会极大提升你对 Go 标准库的熟练度,让它成为你工具箱里最顺手的那一把。

注:Melkey是机器学习工程师,因为他的第四站中,更多是数据处理相关的实战路径。

良师益友:来自一线的精选资源清单

在这条充满挑战的实践之路上,你不是一个人在战斗。Melkey 也分享了那些曾给予他巨大帮助的“良师益友”。这份清单的宝贵之处在于,它经过了生产一线工程师的真实筛选:

  • Web 后端实战圣经:《Let’s Go Further》 by Alex Edwards

这本书被誉为 Go Web 开发的经典之作。即便时隔数年,其中的原则和实践依然极具价值。我也极力推荐这本书,Alex 的代码风格非常清晰,对初学者极其友好,能帮你打下坚实的基础。

  • 测试驱动开发双璧:《Learn Go with Tests》 & 《Writing an Interpreter in Go》

前者是优秀的在线教程,手把手教你如何通过测试来学习 Go。后者则通过编写一个解释器的过程,让你在实践中深刻理解测试驱动开发(TDD)的精髓。它们不仅教测试,更在教 Go 语言本身。

  • 避坑与最佳实践指南:《100 Go Mistakes and How to Avoid Them》

这是一本能让你快速提升代码质量的“速查手册”。通过学习别人踩过的坑,你可以少走很多弯路,写出更地道、更健壮的 Go 代码。

小结:真正的精通,是一场思维的迁徙

Melkey 的故事告诉我们,精通一门编程语言,从来都不只是学习语法和 API 那么简单。它更像是一场思维的迁徙——你必须愿意放下过去的地图,学习新大陆的规则和文化,并最终成为这片土地上地道的“原住民”

如果你也感觉自己写的 Go 代码“不对劲”,不妨停下来,问问自己:我是在用 Go 的方式思考,还是在用过去的经验翻译?

或许,你的“顿悟”时刻,也正隐藏在重读一遍《Effective Go》的字里行间,或是开启下一个实战项目的决心之中。

你是否也有过类似的“顿悟”时刻?又是哪篇文章、哪个项目或哪位导师,帮助你完成了 Go 思维的重塑?欢迎在评论区分享你的故事。

资料地址:https://www.youtube.com/watch?v=wr8gJMj3ODw


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

Go考古:创始人亲述Go语言的“创世纪”

本文永久链接 – https://tonybai.com/2025/07/03/meet-the-go-team-2012

大家好,我是Tony Bai。

2012 年,Google I/O 大会的舞台上,一个刚刚发布 1.0 版本的编程语言团队,正襟危坐。他们面对着全球开发者的审视和提问,这其中,就有三位图灵奖得主级别的传奇人物:Ken Thompson、Rob Pike 和 Robert Griesemer。

那一年,Go 1.0 的发布,是一个历史性的里程碑。它意味着一个承诺“向后兼容、稳定可靠”的 Go 语言,正式诞生。

今天,就让我们扮演一次“Go 语言考古学家”,拂去时间的尘埃,回到那个被称为“创世纪”的时刻,重温 Go Team 核心成员们的亲口讲述,探寻这门语言最纯粹的初心和设计哲学。

我们为何创造 Go?—— “厌倦了等待 C++ 编译”

在访谈中,当被问及创造 Go 的初衷时,Rob Pike 给出了一个近乎“玩笑”却又无比真实的答案:

“我们厌倦了等待 C++ 的编译。”

他生动地描绘了当时在 Google 内部的日常:为了构建一个巨大的 C++ 二进制文件,团队成员不得不在庞大的计算集群上等待超过一个小时。

更令人抓狂的是失控的依赖管理。Rob Pike 提到,他的同事 Mike Burrows(Chubby 的作者)在一次漫长的编译中发现,一个他从未听说过的、与项目毫无关系的头文件,竟然被重复编译了 37,000 次

“当你用 ifdef 宏来保护依赖时,你最终得到的就是一个极其稠密的、做了太多无用功的依赖之巢。” Rob Pike 总结道。

这个巨大的痛点,催生了 Go 最核心的设计目标之一:从语言层面,彻底解决依赖问题。

  • 清晰的依赖图: Go 的导入路径直接明了。
  • 拒绝无用功: 编译器会拒绝未被使用的导入。
  • 高效的编译链: 设计上保证了“编译包 A 不应再重新编译包 C(如果 A->B->C)”。一旦包 B 被编译,它就携带了关于 C 的所有必要信息。

而对于另一位创始人、C 语言和 Unix 的共同发明者 Ken Thompson 来说,促使他下定决心的“临门一脚”则更为直接和幽默。当被问及为何对 Go 如此热情时,他言简意赅:

“当我试图去读 C++0x(即 C++11)的标准草案时,我就下定决心了。”

全场爆笑。在一门日趋复杂的巨型语言面前,三位大师不约而同地选择了回归简单

Go 的“魔法”时刻 —— 那些改变编程方式的设计

Go 的简洁并非简陋。在这次访谈中,创始人们也分享了那些让他们自己都感到惊喜和自豪的“魔法”设计。

Slices (切片):Ken Thompson 的神来之笔

Rob Pike 回忆道,团队曾为了“数组”到底该如何工作而苦恼了整整一年。他们既想要静态检查的固定长度数组,又渴望某种形式的可变长度数组。在无数次的挣扎后,有一天,Ken Thompson 带着 slice 的想法走进办公室。

“起初我们并不确定这是不是正确答案,” Rob Pike 说,“但一旦我们开始使用它,一切都变得显而易见。” 一个简单而优雅的设计,完美地解决了这个旷日持久的难题。

Interfaces (接口):Rob Pike 的挚爱

对于 Rob Pike 而言,接口是他认为 Go 中最强大的特性。

“接口深刻地改变了我对软件开发的思考方式。一个程序由这些可以轻松‘粘合’在一起的东西组成,这种感觉太棒了。它改变了软件被构建的方式。”

Go 的接口是隐式实现的。这种非侵入式的设计,让组件之间的耦合度降至最低,极大地促进了代码的解耦和可组合性。

Packages (包):看似显然,实则艰难

今天我们觉得理所当然的 Go 包机制——一个包可以由多个文件组成,包内全局变量可以任意顺序声明——在当时也是经过了无数次辩论才最终成型的。

“它看起来似乎是显而易见的,但要弄清楚这一点真的非常困难。” Rob Pike 感叹道。这种“松散”的包设计,极大地简化了代码组织和重构的难度。

有所为,有所不为 —— Go 的设计权衡

当被问及如何看待 D 语言等其他试图改进 C++ 的语言时,Robert Griesemer 阐述了 Go 截然不同的设计哲学:

“我的印象是,D 语言会像 C++ 一样不断成长。而在 Go 中,我们试图采取完全相反的方式:尽可能地移除东西,将其简化到骨架,只保留你构建一切所需的绝对最小值。”

他相信,如果这些小组件是正交且能良好协作的,最终得到的东西会比拥有大量相互掣肘的特性的语言更强大。

这种“少即是多”的哲学,体现在 Go 对许多“流行特性”的刻意“缺失”上。当被问及“最庆幸 Go 缺失了什么特性”时,团队成员提到了:

  • 类型继承体系 (Type Hierarchy)
  • 可选参数 (Optional Arguments)
  • 列表推导式 (List Comprehensions)
  • 三元运算符

Rob Pike 指出,在 Java 或 C++ 中,你通常从设计类型继承树开始。这项工作耗时耗力,一旦发现设计有误,回头修改的成本极高。Go 通过移除类型继承,让程序在演进过程中更易于调整和适应。

为了凸显 Go 的简洁与 C++ 的复杂之间的对比,Rob Pike 更是转述了当时未能到场的 Russ Cox 的一句玩笑话,它为 Go 的哲学做了最好的注脚:
“C++ 的风格指南里条条框框,而 Go 的风格指南第一句或许应该是:你可以使用这门语言的全部。”

回望 2012 的“预言” —— 那些已实现和仍在路上的事

考古的乐趣,在于用今天的视角去审视昨天的预言。在 2012 年,Go Team 对未来的展望,如今看来既有惊人的远见,也留下了些许历史的印记。

  • 对 Go 1.1 的精准预言: 他们当时预测 1.1 版本将专注于性能提升、GC 改进、调度器优化和对更多操作系统的支持。这与后来 Go 1.x 系列的演进路径完全吻合。
  • 对 Go 2.0 的务实态度: 团队明确表示“Go 2 遥遥无期”,Go 2 的新想法将来自于使用 Go 1 中发现的真实需求。这个务实的态度至今仍在指导着 Go 的发展。
  • 最大的“失误”? 当被问及此,团队坦诚地提到了 nil 指针(Tony Hoare 的“十亿美元的错误”),以及循环变量的作用域问题。这些话题,至今仍在社区中被热烈讨论。
  • 未解的难题与渴望: Rob Pike 当时多次提到,他们非常想实现但还没找到完美方案的“网络化的 Channel (netchan)”,以及对一个真正的“抢占式调度器”的渴望。这些难题,在后来的岁月里,通过不同的方式被逐步探索和解决。

小结:回到源头,理解初心

穿越时空,回到 Go 语言的“创世纪”现场,我们听到的不是高深莫测的理论,而是一群务实的工程师,为了解决自己在日常工作中遇到的真实、具体的痛点,而进行的一场充满智慧、权衡与热情的创造。

他们对简洁的极致追求,对工程效率的深刻理解,以及对“少即是多”的坚定信念,共同塑造了今天我们所热爱的 Go 语言。

理解这段历史,就是理解 Go 的灵魂。

参考资料链接:https://www.youtube.com/watch?v=sln-gJaURzk


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats