标签 编译器 下的文章

无痛消灭技术债:Google I/O 2026 开启 Go 自动重构时代

本文永久链接 – https://tonybai.com/2026/05/29/google-io-2026-automated-go-refactoring-eliminating-technical-debt

大家好,我是Tony Bai。

在软件开发的世界里,一直存在着一个令人绝望的“二选一”魔咒。

你要么选择 Python 或 JavaScript:它们写起来如丝般顺滑,能让你在周五下午迅速完成一个功能;但当业务量爆炸、公司准备上市时,那些深埋在代码里的性能瓶颈和类型错误,会让你在无数个深夜里怀疑人生。

你要么选择 C++ 或 Java:它们像装甲车一样坚固,能承载千万级的高并发;但代价是,你需要忍受极其繁琐的语法、漫长的编译时间,以及让新手望而生畏的学习曲线。

难道我们就不能“全都要”吗?

这正是近 20 年前,Google 的三位传奇大佬——Robert Griesemer、Rob Pike 和图灵奖得主 Ken Thompson 在白板前思考的问题。于是,Go 语言诞生了


Go 的核心哲学:打破“开发效率”与“生产可用性”的二选一魔咒

在刚刚结束的 Google I/O 2026 大会上,Go 语言产品负责人 Cameron 和开发者关系负责人 Mark,向全球开发者交出了一份震撼的答卷。

他们宣布,在全新的 Go 1.25 和 1.26 版本中,Go 不仅在底层性能上实现了高达 50% 的跨越式提升,更重要的是,Go 正在利用 AI 和强大的重构工具,彻底终结“代码老化”和“技术债”的噩梦。

今天,我们就来深度拆解这场发布会,看看这门被无数大厂誉为“云原生第一语言”的利器,是如何在 AI 时代完成自我进化的。

AI 时代的编程语言:为什么“无聊(Boring)”反而成了最大的优势?

在很多人眼里,Go 是一门极其“无聊”的语言。

它没有花里胡哨的语法糖,极少引入新的语言特性,甚至你今天写的 Go 1.26 代码,看起来和十几年前的 Go 1.0 代码几乎一模一样。

但这恰恰是 Go 在 AI 时代最可怕的护城河。

“机器可读性,决定了 AI 代码生成的上限。” Mark 在演讲中一语道破天机。

当今时代,越来越多的代码是由 AI 生成的。大语言模型(LLM)最喜欢什么样的语言?

  • 语法简单、确定性强:这意味着 AI 不容易产生“幻觉”。
  • 标准化的格式(gofmt):这意味着 AI 生成的代码不需要人类再去调整排版。
  • 强类型系统:这意味着 AI 生成的代码可以在编译期就得到验证。

Go 语言的这些“无聊”特质,使得它成为了 AI 编写、阅读和编辑的完美对象。但这还不够。随着项目的发展,API 会被弃用,旧的代码模式会过时。如何保证海量的(包括 AI 生成的)历史代码,不沦为难以维护的“屎山”?

杀手锏:gofix 与现代转换器(Modernizers)

在 Go 1.26 中,官方重写了 gofix 引擎,推出了一项堪称“代码保洁员”的神级功能——连续现代化(Continuous Modernization)

依托 Go 强大的静态分析框架,gofix 现在包含了 20 多个预置的“现代转换器(Modernizers)”。它能做什么?

假设你的项目里还在使用老的代码模式,或者某个旧的辅助函数(比如 proto.String)现在可以直接用语言内置的 new() 函数来替代。你只需运行 gofix,它就会在确保语义完全等价、不破坏原始行为的前提下,将你整个代码库中的陈旧代码,一键升级为最现代、最地道的 Go 代码!

甚至,作为库的开发者,你可以在弃用的 API 上加上一句简单的指令://go:fix inline。

当调用者运行 gofix 时,系统会自动将他们代码中所有调用该废弃 API 的地方,直接内联替换为最新的实现。

在 Google 内部,这个工具已经自动提交了超过 18,000 个代码变更。 它硬生生地将一个最古老的 Go 代码库,毫无痛感地升级到了最新的语言特性。

在其他生态里,代码会随着时间流逝而腐烂;而在 Go 里,有了 gofix 和向后兼容的承诺,旧代码不仅不会成为负债,反而是一笔随时可以自动升级的资产。

征服并发测试:告别 time.Sleep 带来的玄学 Bug

如果你写过高并发的程序,你一定被并发测试折磨过。

Goroutine 的调度是无序的。为了测试并发代码,开发者往往被迫在测试里写满丑陋的 time.Sleep(2 * time.Second),或者设置各种超时机制。这不仅让测试运行极其缓慢,还会导致 CI/CD 流水线中出现大量随机失败的玄学 Bug(Flaky Tests)。

在 Go 1.25 中,官方祭出了终结并发测试噩梦的大杀器:testing/synctest 库正式 GA。

这是一个天才般的设计。synctest 引入了一个名为“气泡(Bubble)”的概念:

它在测试中创建了一个完全隔离的运行环境。在这个气泡里,所有的 Goroutine 都在使用一个“合成的假时钟(Synthetic Clock)”

当气泡内的所有 Goroutine 都因为等待 I/O 或休眠而被阻塞时,气泡的时钟会自动且瞬间向前快进!

过去一个需要死等 5 秒钟才能触发超时的并发测试,现在使用 synctest,可以在几毫秒内确定性地跑完!这不仅将测试速度提升了千百倍,更重要的是,它让多线程的交织执行变得绝对确定且可控。这是给所有硬核后端开发者的巨大福音。

零代码修改,性能飙升 50%:绿茶垃圾回收器(Green Tea GC)

如果说前面的工具是为了提升开发效率(Productivity),那么接下来的底层架构升级,则是为了捍卫 Go 在云计算领域的绝对统治力(Production Readiness)。

在云原生时代,Docker、Kubernetes、Terraform 全都是用 Go 写的。Go 必须榨干每一滴硬件性能。

在 Go 1.25 实验性引入、并在 1.26 默认启用的 Green Tea(绿茶)垃圾回收器,是一次系统级的底层重构。

传统的 GC 算法是将内存视为一个个零散的对象进行扫描和回收,这种设计在现代多核 CPU 面前显得极其低效。而 Green Tea GC 则完全顺应了现代硬件的设计哲学:

  1. 按页(Pages)处理:它将工作的基本单元从单个对象,转变为大块连续的内存页。
  2. 向量化加速:它允许运行时极其高效地利用现代 CPU 的高吞吐量向量加速指令(SIMD)。
  3. 缓存友好:大幅减少了高延迟的内存提取。

最恐怖的是它的收益:在不修改你任何一行业务代码的前提下,升级到 Go 1.26 后,大多数应用的 GC CPU 开销直接下降了 10%;而对于那些内存布局极其复杂的重型应用,CPU 消耗甚至能暴跌 50%!

此外,Go 1.26 还在运行时做出了多项优化:

  • 更多的栈分配:通过更智能的逃逸分析,将大量原本需要在堆(Heap)上分配的内存,直接转移到栈(Stack)上。栈分配不仅速度快,而且对 GC 零负担,缓存局部性极佳。
  • CGo 调用提速 30%:极大地降低了跨界调用的成本,这使得 Go 语言能够更轻松地切入对底层硬件库依赖极强的机器学习(ML)、游戏引擎和 GUI 领域。

这就是 Go 对兼容性承诺的最美诠释:你只需要升级版本并重新编译,你的系统就自动变得更强了。

拥抱 AI:MCP 官方 SDK 与未来的开发生态

在大模型全面爆发的今天,让 AI 能够理解并操作系统,成为了关键的技术壁垒。

去年,Go 官方悄然发布了 Model Context Protocol (MCP)官方 SDK

MCP 是什么?它是一个让你的服务能够标准化地为 LLMs(大语言模型)提供上下文和工具调用的协议。

借助这个 SDK,你可以极其可靠地利用 Go 的并发和网络能力,将你的企业数据、内部 API 甚至本地文件系统,安全地暴露给 AI 智能体。

不仅如此,Google 自己也在“吃狗粮”。他们正在利用这个 MCP SDK,构建能够向 AI 开发工具暴露更多 Go 工具链(Toolchain)能力的服务器。比如,在官方的语言服务器 gopls 中,已经内置了一个实验性的 MCP server。

这意味着,在未来,像 Cursor 这样的 AI 编程助手,将能够通过 MCP 协议,直接读取你的项目依赖、调用 gofix 重构代码、甚至运行特定的并发测试,从而实现真正意义上的“AI 自动化工程”。

小结:为什么 20 年后,Go 依然是开发者的首选?

近 20 年过去了,软件开发的世界经历了从单体架构到微服务,从云原生到 AI 智能体的天翻地覆。许多曾经风光无限的语言渐渐老去,但 Go 却显得愈发年轻和强壮。

这场发布会揭示了 Go 长盛不衰的核心密码:它从来不仅仅是一门语言,它是一个端到端的软件工程平台。

当其他语言在追求花哨的语法糖时,Go 在默默地优化 gofmt 和 gofix,确保几百人协作时代码风格绝对一致;

当其他语言在纠结垃圾回收停顿时,Go 推出了 Green Tea GC,默默帮你省下千万级的服务器账单;

当 AI 时代来临时,Go 以其极简的机器可读性和强大的 MCP 协议支持,成为了 AI 智能体最坚实的后端基座。

如果你想在今天构建一个能在 10 年后依然易于维护、性能强劲、且对 AI 极度友好的系统。

答案很无聊,但很明确:选择 Go。

资料链接:https://www.youtube.com/watch?v=l4lneZYtjQg


今日开放讨论:

你的项目中,存在因为“代码老化”而不敢轻易重构的历史遗留模块吗?Go 1.26 引入的 gofix inline 自动化升级思路,是否能为你的团队带来启发?

欢迎在评论区分享你的技术债血泪史,我们一起探讨 AI 时代的重构之道!


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 从0 开始构建 Agent Harness 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


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

别再瞎写 go.mod 了!一行 go 1.xx,竟藏着 7 个足以颠覆你认知的“秘密开关”

本文永久链接 – https://tonybai.com/2026/05/13/go-mod-hidden-features-7-secret-switches-in-go-version

大家好,我是Tony Bai。

在这个“CV 工程师(复制粘贴工程师)”盛行的时代,很多 Go 开发者在新建项目时,不会使用go mod init来初始化一个模块,而是会熟练地从别的 go.mod 文件里,复制粘贴那行 go 1.xx,或者直接复制一个starter 脚手架Go 工程。我们似乎都默认了go.mod中go 1.xx 的作用——“嗯,就是声明一下我用的 Go 版本嘛,不重要。”

我们可能会花几天时间去争论 GOMAXPROCS 该设成多少,或者为了一个微小的性能优化而重构代码,但很少有人会去深究这行看似“平平无奇”的指令,到底在 Go 的世界里扮演着怎样的角色。

但如果我今天告诉你,这行被我们忽视了近 8 年的“魔法咒语”,在 Go 工具链的底层,其实悄悄地控制着多达 7 个维度的编译和运行时行为呢?

从你能不能用泛型,到 go mod tidy 的工作模式,再到你的程序在生产环境中的默认行为……这一切,都由这行代码说了算。

最近,我扎进了 Go 语言的源码,试图去解开这个“最熟悉的陌生人”的秘密。而我发现的真相,足以颠覆多数 Gopher 的认知。

今天,就让我们来一场硬核的“源码考古”,逐一拆解这行 go 指令背后的七大用途。

go directive 是什么

go.mod 中的 go directive 格式如下:

go 1.21.0

它由 golang.org/x/mod/modfile 包解析,并存储在 modfile.File.Go.Version 字段中。

// $GOROOT/src/cmd/vendor/golang.org/x/mod/modfile/rule.go
type Go struct {
    Version string // "1.23"
    Syntax  *Line
}

有趣的是,如果你的 go.mod 文件里没有这一行(比如一些远古项目),Go 工具链并不会报错,而是会默默地为你应用一个默认值:go 1.16

// $GOROOT/src/cmd/go/internal/gover/version.go
const DefaultGoModVersion = "1.16"

为什么是 1.16 这个看起来有点奇怪的数字?Go 源码的注释给了我们答案:

因为 Go 1.17 对模块图的语义进行了重大修改。为了保证对那些没有 go 指令的、极其古老的项目的兼容性,我们必须保守地假设它遵循 Go 1.16 的规则。这个默认值,永远不会再被提高了。

这背后,体现了 Go 团队对“向后兼容性”近乎偏执的坚守。

用途一:语言版本的“守门人”(最核心)

这是 go 指令最广为人知、也是最直接的作用:它决定了编译器允许你使用哪些语言特性。

在 Go 的源码深处,go 命令在编译每个包时,都会将 go.mod 中定义的版本号,通过 -lang 标志,像一道“圣旨”一样传递给编译器。

// $GOROOT/src/cmd/compile/internal/noder/irgen.go
conf := types2.Config{
    GoVersion: base.Flag.Lang,  // 来自 -lang 标志,由 go.mod 的 go directive 决定
    ...
}

编译器内部的类型检查器,会用一个名为 allowVersion 的函数,来判断你写的某段代码,是否“越界”使用了当前版本还不支持的“未来语法”。

// $GOROOT/src/cmd/compile/internal/types2/version.go
func (check *Checker) allowVersion(want goVersion) bool {
    return !check.version.isValid() || check.version.cmp(want) >= 0
}

经典案例:Go 1.22 的 for 循环变量“拨乱反正”

Go 1.22 修复了 for 循环变量在闭包中常年为人诟病的“共享变量”问题:

// go.mod: go 1.21  → 旧语义,所有迭代共享同一变量
// go.mod: go 1.22  → 新语义,每次迭代独立变量

而这个行为的开关,正是由 go 指令严格控制的

// 示例:
// 当 go.mod 中是 go 1.21 时,以下代码会打印 3 个 "3"
// 当 go.mod 中是 go 1.22 时,以下代码会打印 0, 1, 2
funcs := make([]func(), 3)
for i := 0; i < 3; i++ {
    funcs[i] = func() { fmt.Println(i) }
}

for _, f := range funcs {
    f()
}

这意味着,仅仅是修改 go.mod 里的一行数字,就可能让你的程序的输出结果发生根本性的变化!

其他受Go 版本控制的语言特性一览

如果你试图在 go 1.21 的模块里写 for i := range 10,编译器会毫不留情地报错,并清晰地告诉你:“检查你的 go.mod 文件!”

用途二:模块图裁剪(Module Graph Pruning)的“总开关”

这是 Go 1.17 引入的一项重要优化,它彻底改变了 Go 命令解析依赖图的方式,但很多开发者对此却知之甚少。

在 Go 的源码中,1.17 被定义为一个分水岭:

// src/cmd/go/internal/gover/version.go
ExplicitIndirectVersion = "1.17"  // 启用图裁剪的版本

go.mod 中的版本号,将决定你的项目采用哪种依赖图模式:

// $GOROOT/src/cmd/go/internal/modload/modfile.go
func pruningForGoVersion(goVersion string) modPruning {
    if gover.Compare(goVersion, gover.ExplicitIndirectVersion) < 0 {
        return unpruned  // < 1.17:加载完整传递依赖图
    }
    return pruned        // >= 1.17:启用图裁剪
}

go < 1.17(完整模式 Unpruned)

  • go.mod 文件里只需要列出你的直接依赖。
  • 但代价是,每次构建时,Go 命令都需要递归地、完整地加载所有传递依赖(A 依赖 B,B 依赖 C,C 依赖 D……)的 go.mod 文件,构建一个庞大的、完整的依赖图。这在大型项目中,极其缓慢。

go >= 1.17(裁剪模式 Pruned)

  • go.mod 文件里必须显式地列出所有传递依赖,哪怕它们是间接的。这就是你经常看到的 // indirect 标记的由来。
  • 好处是,Go 命令在构建时,可以“偷懒”,只读取直接依赖的 go.mod 文件,而对那些未真正使用的间接依赖进行“裁剪”,从而极大地加快了构建速度,并增强了构建的可重现性。
# go 1.17+ 的 go.mod 示例:间接依赖被显式列出
require (
    github.com/some/direct v1.2.3  

    github.com/indirect/dep v0.1.0 // indirect  ← 1.17+ 才会出现
)

用途三:all 模式的“结界”

go test all 这样的命令,在不同的 Go 版本下,其“all”所覆盖的范围,竟然是不同的!而这个“结界”的开关,同样是 go 指令。

在源码中,1.16 是另一个分水岭:

这个改动非常微妙,但影响深远。它意味着在 Go 1.16 之后,go test all 不再会因为某个你八竿子打不着的、间接依赖的测试代码写错了而失败,让 all 模式变得更加聚焦和实用。

用途四:GODEBUG 运行时行为的“默认存档”

这是 Go 1.21 引入的最具“魔力”,也最危险的一个特性:go 指令,决定了你的程序在生产环境中的 GODEBUG 默认值!

Go 团队为了在不破坏向后兼容性的前提下,修复一些语言的历史包袱(比如 panic(nil)),引入了 GODEBUG 环境变量。

当编译器在构建你的 main 包时,它会检查 go.mod 里的版本号,然后将一套与该版本行为相匹配的 GODEBUG 默认值,直接编译进你的二进制文件里。

// $GOROOT/src/cmd/go/internal/load/godebug.go
func godebugForGoVersion(v string) map[string]string {
    // ...
    def := make(map[string]string)
    for _, info := range godebugs.All {
        if n < info.Changed {
            def[info.Name] = info.Old  // 使用旧版本的默认值
        }
    }
    return def
}

经典案例:

  • 如果你的 go.mod 写的是 go 1.20,那么你的程序在运行时,会默认 panicnil=1(允许 panic(nil) 这种旧的、不规范的行为)。
  • 但如果你把它改成 go 1.21,那么程序的默认行为就会变成 panicnil=0(panic(nil) 会在运行时直接报错)。

官方文档说得很清楚:

Go 工具链会修正自己的默认行为,以尽可能地匹配你声明的旧版本。

这意味着,升级 go 指令,是一项具有潜在风险的操作。 它可能在你不经意间,改变程序的运行时行为。

用途五:Toolchain 自动切换的“指挥官”

从 Go 1.21 开始,你的电脑上可以同时安装多个 Go 版本。而决定在编译某个特定项目时,到底该用哪个版本的“指挥官”,就是 go 指令。

当你的 GOTOOLCHAIN 环境变量设为 auto 时,go directive 会触发自动工具链切换。

// $GOROOT/src/cmd/go/internal/toolchain/select.go
if gover.Compare(goVers, minVers) > 0 {
    gotoolchain = "go" + goVers
    // ...
    gover.Startup.AutoGoVersion = goVers
    // 打印:go: upgrading toolchain to goX.Y.Z (required by go line in go.mod)
}

下面是一个示例:

# go.mod
module example.com/myapp
go 1.23.0

# 你的电脑当前默认安装的是 go1.21.0
# 当你在这个项目下运行 go build 时……
# → Go 命令会发现版本不匹配,自动去下载并切换到 go1.23.0 工具链!
# 并打印:go: upgrading toolchain to go1.23.0 ...

同时,Go 1.21 还引入了“严格版本约束”:一个 go 1.21+ 的模块,其 go 指令版本,必须 大于或等于 它所有依赖模块的 go 版本。

// $GOROOT/src/cmd/go/internal/gover/version.go
// GoStrictVersion is the Go version at which the Go versions became "strict"
// in the sense that every module must have a go version line ≥ all its dependencies.
GoStrictVersion = "1.21"

用途六 & 七:Vendor 模式与 go mod tidy 的“幕后推手”

除了上述几大核心用途,go 指令还在一些细节上,扮演着“幕后推手”的角色。

Vendor 模式

从 Go 1.17 开始,go mod vendor 会在 vendor/modules.txt 文件里,为每一个依赖项记录其 go 版本:

## explicit; go 1.17

这确保了即使在离线 vendor 模式下,编译器也能为每个包应用正确的语言特性。

# go.mod: go 1.16 → vendor/modules.txt 不含版本信息,统一猜测为 1.16
# go.mod: go 1.17 → vendor/modules.txt 含版本信息,每个包用自己的版本

go mod tidy的行为

go 指令的版本,还会影响 tidy 命令在依赖保留范围、go.sum 校验范围、以及间接依赖分组显示等方面的细微行为。

1. 保留的依赖范围

// $GOROOT/src/cmd/go/internal/modcmd/tidy.go
// Go versions 1.17 and higher retain more requirements in order to
// support lazy module loading.

2. go.sum 的校验范围

// $GOROOT/src/cmd/go/internal/gover/version.go
// TidyGoModSumVersion is the Go version at which 'go mod tidy' preserves
// go.mod checksums needed to build test dependencies of packages in "all"
TidyGoModSumVersion = "1.21"

3. 间接依赖的分组显示

SeparateIndirectVersion = "1.17"
// go >= 1.17:// indirect 依赖单独成块

小结:一行代码背后的“架构演进史”

看到这里,你还会觉得 go 1.xx 只是一行简单的版本声明吗?

这短短的一行代码,像一根时间线,串联起了 Go 语言从诞生到成熟的整个演进历史。

go directive
    │
    ├─ 编译器 -lang 标志
    │       └─ 控制语言特性(泛型/loopvar/range整数...)
    │
    ├─ 模块图裁剪模式
    │       ├─ < 1.17:unpruned(完整传递依赖图)
    │       └─ >= 1.17:pruned(显式间接依赖 + 图裁剪)
    │
    ├─ "all" 模式范围
    │       ├─ < 1.16:包含外部包的测试依赖
    │       └─ >= 1.16:仅主模块的传递导入
    │
    ├─ GODEBUG 运行时默认值
    │       └─ 编译进二进制,影响运行时行为
    │
    ├─ Toolchain 自动选择(>= 1.21)
    │       └─ GOTOOLCHAIN=auto 时触发工具链下载/切换
    │
    ├─ vendor/modules.txt 版本记录(>= 1.17)
    │       └─ 影响 vendor 模式下的语言版本应用
    │
    └─ go mod tidy 行为
            ├─ 依赖保留范围
            ├─ go.sum 校验范围
            └─ 间接依赖分组

它既是语言特性的“守门人”,又是模块系统的“总开关”,还是运行时行为的“默认存档”。

它身上,凝聚了 Go 团队对向后兼容性、工程效率、可重现性这三大核心哲学最深刻的思考与权衡。

下一次,当你新建一个项目,或者准备升级 go.mod 里的那个版本号时,请务必三思。

因为你修改的,不仅仅是一个数字,而是你与 Go 工具链之间,一份极其重要、且牵一发而动全身的“契约”。


今日互动探讨:

在你的日常Go编程中,你有没有遇到过写错Go version带来的“坑”?你觉得 Go 语言go.mod中的go version用起来怎样?是否还有改进的地方。

欢迎在评论区分享你的血泪史与感悟!


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 从0 开始构建 Agent Harness 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 从 0 开始构建 Agent Harness Go语言精进之路1 Go语言精进之路2 Go语言第一课 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