还在当“上下文搬运工”?我写了一门课,帮你重塑AI开发工作流

本文永久链接 – https://tonybai.com/2025/11/20/ai-native-dev-workflow 大家好,我是Tony Bai。 最近半年,我发现我的开发日常,正被一种新的“工作流摩擦”所困扰。 我猜,你可能也感同身受。 我们在一块屏幕上沉浸于IDE中的Go代码,在另一块屏幕上,则像一个勤奋的“学生”,不断向AI大模型提问。我们从代码库中精心挑选上下文,复制,切换窗口,粘贴,然后带着AI给出的答案,再复制,切换,粘贴回来。 ...

November 20, 2025 · 6 min · Tony Bai

“6 个月,47 个微服务”:一场由“简历驱动”引发的架构灾难

本文永久链接 – https://tonybai.com/2025/11/02/6-months-47-microservices-architecture-disaster 大家好,我是Tony Bai。 “我们有一个运行了 8 年的 Python 单体应用,20 万行代码,工作得很好,很少崩溃,8 分钟就能部署。现在,新来的首席架构师,入职仅 3 个月,就要我们在 6 个月内,把它拆分成 47 个微服务。” ...

November 2, 2025 · 7 min · Tony Bai

Go写业务是垃圾?Rust重写是坨屎?聊聊程序员评论区里的那股“煞气”

本文永久链接 – https://tonybai.com/2025/09/19/the-tension-in-programmer-comments 大家好,我是Tony Bai。 做公众号/博客这些年,我收到了成千上万条来自程序员朋友的评论。绝大多数都充满了智慧、好奇和善意,正是这些交流,构成了我持续分享的最大动力。但与此同时,我也常常在评论区里,感受到一股强烈的、带有攻击性的无形之气。 ...

September 19, 2025 · 6 min · Tony Bai

一文告诉你如何判断Go接口变量是否相等

本文永久链接 – https://tonybai.com/2023/02/19/how-to-determine-if-two-interface-vars-are-equal 近日一位《Go语言第一课》专栏的读者向我提出一个问题,代码如下: func main() { printNonEmptyInterface1() } type T struct { name string } func (t T) Error() string { return "bad error" } func printNonEmptyInterface1() { var err1 error // 非空接口类型 var err1ptr error // 非空接口类型 var err2 error // 非空接口类型 var err2ptr error // 非空接口类型 err1 = T{"eden"} err1ptr = &T{"eden"} err2 = T{"eden"} err2ptr = &T{"eden"} println("err1:", err1) println("err2:", err2) println("err1 = err2:", err1 == err2) // true println("err1ptr:", err1ptr) println("err2ptr:", err2ptr) println("err1ptr = err2ptr:", err1ptr == err2ptr) // false } 他的问题就是:“当动态类型是指针的时候,接口变量不相等;当动态类型不是指针的时候,接口变量相等,这个怎么理解呢?”。 ...

February 19, 2023 · 6 min · Tony Bai

通过实例理解Go标准库context包

原weibo账号处于jy状态,临时先用小号 https://weibo.com/u/6484441286,欢迎大家关注! “Gopher部落”知识星球双十一新人特惠,领劵加入即享立减88元优惠 – https://t.zsxq.com/078E1QTjM 本文永久链接 – https://tonybai.com/2022/11/08/understand-go-context-by-example 自从context包在Go 1.7版本加入Go标准库,它就成为了Go标准库中较难理解和易误用的包之一。在我的博客中目前尚未有一篇系统介绍context包的文章,很多来自Go专栏或《Go语言精进之路》的读者都希望我能写一篇介绍context包的文章,今天我就来尝试一下^_^。 ...

November 8, 2022 · 19 min · Tony Bai

Go语言map类型变量背后的那些事儿

本文永久链接 – https://tonybai.com/2022/03/15/the-underlying-of-a-map-type-variable 切片(slice)和map是Go语言中最常用的两种原生复合数据类型,同时也是最容易使初学者感觉迷惑和“掉坑”的两个类型,这很大程度是因为Go runtime层的存在。什么是Go runtime层?可以参考我在《Go语言第一课FAQ》中的解释。 ...

March 15, 2022 · 5 min · Tony Bai

为什么这个T类型实例无法调用*T类型的方法

本文永久链接 – https://tonybai.com/2022/02/27/go-addressable 近期在“Go语言第一课”专栏后台看到一位学员的一则留言,如下图: 由于有课程上下文,所以我这里将问题的上下文重新描述一下。 在专栏的第25讲,我们学习了Go语言提供的一个“语法糖”,比如下面这个例子: type T struct { a int } func (t T) M1() { t.a = 10 } func (t *T) M2() { t.a = 11 } func main() { var t1 T t1.M1() t1.M2() var t2 = &T{} t2.M1() t2.M2() } Go语言的类型有方法集合(method set)的概念,以上面例子来说,类型T的方法集合为{M1},而类型*T的方法集合为{M1, M2}。不过方法集合仅用于判断某类型是否实现某接口类型。当我们通过类型实例来调用方法时,Go会提供“语法糖”。上面这个例子先声明了类型T的变量t1,我们看到它不仅可以调用其方法集合中receiver参数类型为T的方法M1,它还可以直接调用不属于其方法集合的、receiver参数类型为*T的方法M2。T类型的实例t1之所以可以调用receiver参数类型为*T的方法M2都是Go编译器在背后自动进行转换的结果,即t1.M2()这种用法是Go提供的“语法糖”:Go判断t1的类型为T,与方法M2的receiver参数类型*T不一致后,会自动将t1.M2()转换为(&t1).M2()。 ...

February 27, 2022 · 6 min · Tony Bai

Go GC如何检测内存对象中是否包含指针

本文永久链接 – https://tonybai.com/2022/02/21/how-gc-detect-pointer-in-mem-obj 众所周知,Go是带垃圾回收(GC)的编程语言,开发者通常不需要考虑对内存的管理,降低了心智负担。Go程序运行的时候,GC在背后默默辛劳地为开发者**“擦屁股”**:把无法reach到的内存对象定期地释放掉以备后续重用。 ...

February 21, 2022 · 8 min · Tony Bai

“Go语言第一课”结课了

本文永久链接 – https://tonybai.com/2022/02/17/go-first-course-close 就在家家户户刚刚过完虎年元宵佳节之际,我的Go语言专栏:《Tony Bai·Go语言第一课》也迎来了它的最后一讲结术语。 这门专栏的撰写开始于2021年5月中旬,翻看我用于管理专栏原始文稿的github仓库的commit log记录,这一有纪念价值的日子被精确定位在5月16日: ...

February 17, 2022 · 5 min · Tony Bai

2021年博客回顾与总结

本文永久链接 – https://tonybai.com/2021/12/31/2021-blog-summary 2021年对我来说是极其充实的一年。 在这一年里,生活上的充实体现在带娃上。除了要带不到一岁的二宝,还要辅导大宝学习,陪大宝上补习班。 工作中,由于我刚入行智能网联汽车这个行业,要学的东西很多,要做的东西也很很多,要解决的问题同样很多,每天都十分忙碌。 ...

December 31, 2021 · 4 min · Tony Bai