别把 Go 写成 Java:毁掉项目从过度架构开始

本文永久链接 – https://tonybai.com/2026/06/05/stop-writing-go-like-java-avoid-over-architecting

大家好,我是Tony Bai。

前不久,Go 语言社区 Reddit (r/golang) 上爆发了两场激烈的争论。

这两个帖子的主题直击了无数 Go 开发者的灵魂深处:

  1. 我们该如何构建一个大型的 Go 模块化单体架构,而不被复杂的“架构设计”淹没?
  2. 为什么现在的 Go 项目里,pkg 和 internal 目录被滥用得如此令人发指?

如果你正在维护一个中大型的 Go 后端项目,你大概率经历过这样的绝望时刻:为了加一个极其简单的业务字段,你需要穿透 handler、usecase、domain、repository、adapter 等足足五层抽象结构;你的项目根目录下躺着一个 pkg 文件夹,里面又套着 internal,代码藏在七八级目录深处。

你以为你在写出业界最高标准的“整洁架构(Clean Architecture)”,但实际上,你正在把 Go 语言写成你曾经最讨厌的“臃肿企业级 Java”。

今天,我们就来透过这层过度工程(Over-engineering)的外衣,看看顶级开发者们是如何打破这种“架构伪神话”,用最符合 Go 哲学的极简方式,构建起能支撑千万级流量的大型单体项目的。

被“标准规范”毒害的洋葱病

在一个全新的 Go 项目立项时,很多技术负责人的第一反应就是去 GitHub 搜一个叫做 golang-standards/project-layout 的高赞仓库,然后照猫画虎地建起一堆目录。

紧接着,悲剧就开始了。综合 Reddit 各位资深大佬的吐血经验,以下两大陷阱,几乎踩中了 90% 的业务团队:

陷阱 1:“死去的” pkg 与被滥用的 internal

帖子原作者一针见血地指出:pkg 目录是时代的眼泪,而 internal 正在遭受前所未有的滥用。

在早期的 GOPATH 时代,我们需要一个地方来区分业务代码和第三方包,于是有了 pkg。但在 Go Modules 已经全面普及的今天,你的代码仓库根目录本身就是一个 Module。在 root 下面再嵌套一层 pkg 纯粹是“脱裤子放屁”——它除了让你的 import 路径变长 4 个字符之外,没有任何实际意义。

更致命的是 internal。官方引入 internal 是为了防止库开发者暴露内部 API 给第三方。但是现在的业务开发团队,为了所谓的“代码隔离”,盲目地把整个 App 的所有核心逻辑全塞进 internal,导致项目结构变成了这样:

internal/app/modules/order/usecase/impl/order.go

当你接手这种代码时,你每天有 30% 的时间在 VSCode 里狂按文件树,试图搞清楚自己到底在哪。

陷阱 2:生搬硬套的 DDD 与洋葱架构(Clean Architecture)

一位在电商公司写 Go 的老哥抱怨道:他试图用严格的 DDD(领域驱动设计)和六边形架构来组织他的模块化单体代码。结果是,随着项目增大,维持这种“整洁”变成了噩梦。

每一次新增功能,都要处理无休止的接口绑定(Wiring dependencies)、防止循环引用,以及为了“解耦”而写的大量毫无意义的样板代码(Boilerplate)。“我感觉自己花在维护架构上的时间,甚至超过了实际交付业务功能的时间。”

记住:Go 语言的灵魂是简单直接。强行引入 Java/C# 语境下的沉重分层,就像给一辆轻巧的保时捷跑车装上了坦克的履带。

为什么“扁平化”才是 Go 架构的尽头?

面对这种极度臃肿的代码,我们在 Reddit 的评论区看到了海外老炮们的共识:Opting for a flatter structure typically guides you organically away from overly nested internal. (选择更扁平的结构,通常能自然而然地引导你远离过度嵌套的代码气味)。

在 Go 语言中,优秀的架构并不是靠“目录分层”来体现的,而是靠“领域边界(Domain Boundaries)”和“依赖流向”来体现的。

真相 1:Package 的划分应该基于“业务能力”,而不是“技术层次”

把项目按 controllers/、services/、models/ 划分是典型的反模式(MVC遗毒)。这种结构下,如果你要修改一个关于“订单”的功能,你必须在好几个目录下反复横跳。

真正懂 Go 的做法是:按领域(Domain)划分子包。 一个 order 包里,就应该包含订单的结构体、订单的仓储接口、乃至相关的处理逻辑。所有的东西都在一起,高内聚。

真相 2:不需要过度设计“防腐层”,直到你真正觉得痛

一些高级开发者指出,他们宁愿花更多的时间去做“事件风暴(EventStorming)”和领域建模,也不愿意去写抽象接口。如果你的 order_repository.go 从第一天起就只有一个 Postgres 实现,且未来三年都不会换数据库,那么你为了“解耦”而提取的一个洋葱接口层,就是纯粹的成本浪费。

大型 Go 项目实用构建指南

抛开那些玄乎其玄的词汇,如果你想构建一个不崩溃的、好维护的大型模块化单体(Modular Monolith),请立刻遵循以下四条“少即是多”的务实法则:

法则 1:干掉 pkg,克制使用 internal

除非你正在写一个准备开源给全世界使用的公共 Library 包,否则你的微服务或单体 Web 应用根本不需要 pkg 目录。

同样,把你的核心代码从深渊般的 internal/app/core/… 中解放出来。把业务包直接平铺在根目录或者按大模块放在一个外层目录即可。让文件树尽可能的“浅”。

法则 2:采用极简的领域扁平结构(Domain-Driven Flattening)

正如评论区大佬给出的终极解法,你的项目结构应该看起来像这样:

cmd/
  server/main.go        // 所有依赖注入和组装都在这里完成(Composition Root)
domain/                 // 或者直接放在根目录
  order/
    order.go            // 领域模型(Entity/Aggregate)
    repository.go       // 接口(依赖倒置,只定义 order 需要什么)
    postgres_repo.go    // 直接在同一个包下实现,或者平铺
  user/
    ...
  catalog/
    ...

不要再建什么 port 和 adapter 文件夹了!order.go 就是你的核心,postgres_repo.go 就是它的具体实现。它们呆在一个包里,简单明了,任何人 grep 搜索一下就能秒懂。

法则 3:让 Consumer 定义接口(Interface Segregation)

很多人为了解耦,喜欢在一个单独的 interface 包里定义全局接口,这又是 Java 思维作祟。

在 Go 里,接口应该是“隐式实现”的。不要在提供者(Provider)端定义接口,要在消费者(Consumer)端定义。

比如 order 包需要发邮件,它不应该去依赖 email 包的接口。它应该在自己的包里定义一个极小的 type Mailer interface { Send(…) },然后在 main.go 中把真正的 Email 服务注入进去。这就是 Go 解除循环依赖的最强法宝。

法则 4:一切脏活累活,全扔进 main.go

对于单体应用来说,不要试图在每个模块内部做复杂的自动依赖注入(Autowiring)或自启动钩子。

保持每个模块都是极度干净、被动的。然后在你唯一的 cmd/server/main.go 里,显式地初始化数据库、初始化各个模块、然后手动把它们组装(Wire)在一起。是的,这个 main.go 可能会有几百行甚至上千行,但它让你在启动时一目了然,排查问题再也不用像个无头苍蝇一样在迷宫里乱撞了。

小结:回归大道至简

不管是摒弃 pkg,还是剥离 500 层的“整洁架构”,这背后体现的其实是 Go 语言最深刻的哲学:Pragmatism(务实主义)。

技术架构的终极目标,是为了让人读得懂,让业务跑得快,而不是为了满足程序员在代码里“建构精密钟表”的虚荣心。

如果你的代码不能让人在 30 秒内找到修改点,不能让你通过一个简单的 grep 搜索就锁定业务逻辑,那么不管你的架构图画得多么符合六边形、洋葱或者 DDD 规范,它都是一个失败的设计。

所以,立刻打开你的 IDE,试着把你那些嵌套了五六层的文件夹拖出来吧。相信我,当你删掉那一堆废话般的中间层接口时,你会感受到前所未有的舒畅。

资料链接:

  • https://www.reddit.com/r/golang/comments/1tftqpj/how_do_you_structure_and_maintain_large_go/
  • https://www.reddit.com/r/golang/comments/1tft8ds/pkg_internal_directories_are_way_overused/

今日互动探讨:

在你的 Go 项目里,曾经为了遵循所谓的“规范设计”做过哪些现在看起来极其离谱的过度工程?你现在的项目是扁平结构还是洋葱结构?

欢迎在评论区留言晒出你的代码结构,或者 @出那个每天沉迷于建文件夹的同事。让我们一起探讨,什么是真正的“Go 语言地道之美”!

(如果你觉得这篇实操指南帮到了你,请不要吝啬你的点赞和转发!)


还在为写 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}


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

开源维护者的困境

本文永久链接 – https://tonybai.com/2026/06/04/the-maintainers-dilemma

大家好,我是Tony Bai。

开源软件的繁荣建立在一种隐形的“社会契约”之上:贡献者贡献智慧,维护者投入精力审核。然而,当维护者面对成百上千个待处理的拉取请求(PR)而精疲力竭时,这个契约正滑向崩塌。

AI 的介入似乎提供了一线生机,但也带来了一个灵魂拷问:如果代码是 AI 写的,审核也是 AI 做的,那么“受保护的分支”究竟是在保护什么?开源社区赖以生存的“人与人的连接”是否会随之消失?前Go 语言核心团队成员、gohugo和Cobra 创始人 Steve Francia 近期撰写了一篇文章,深度剖析了这一“维护者的困境”。

本文便是这篇文章的中译文。


受保护的分支(protected branch)需要第二个人在代码发布前进行审核。这条规则的存在是因为人类会犯错,而第二双眼睛可以捕捉到第一双眼睛遗漏的东西。但如果其中一个审核者是机器人呢?如果两个都是呢?

目前,我可以要求 AI 在我的仓库里发起一个拉取请求(PR),然后由我自己合并它。或者我可以自己写代码,让 AI 来审核。在这两种情况下,分支在技术上都是“受保护的”。但这种保护现在究竟意味着什么?

这些问题值得思考。但它们往往占据了太多的注意力,而一个更迫切的问题却无人问津:现在,在我的各个仓库中,都有来自那些花时间理解代码库、编写测试并提交简洁补丁的人们的未处理拉取请求。我还没审核它们。遗憾的是,讽刺的是,我没审核是因为我深深地在乎。我知道花时间在一个项目上发起 PR 是多么大的事,对于那些我作为志愿者维护的项目更是如此。对于每一个拥有受资助维护者的开源项目,都有数以百万计的未付报酬的人类正盯着日益增长的待办事项,思考着这个周末是该花在处理问题上,还是直接合上电脑出门去。

AI 工具现在可以进行可靠的代码审查、编写补丁和分拣问题。问题不再是它们是否足够好到有用。真正的问题在于,“有用”在何处变成了“负担”,以及过度依赖我们无法轻易重建的东西——维护者与贡献者之间、通过经验积累的判断力,以及围绕这种交流形成的社区——是否会造成破坏。

118 个待处理的拉取请求

我上周查看了 GitHub 通知,然后直接关闭了标签页。Cobra 有 243 个未解决的问题(issues)和 118 个待处理的拉取请求(PR)。Afero 有 114 个问题和 55 个 PR。这两个项目都是我创建的。

尽管我没有及时行动,但这些都是活跃维护的项目。Cobra 支持着 kubectl、GitHub CLI、hugo 以及成千上万的其他工具。当你输入 kubectl get pods 或 gh pr list 时,Cobra 正在解析你的命令。Afero 存在于 Hugo 内部,也存在于 Cobra 自身,以及数以百计的其他项目中。对 Cobra 的一次草率合并可能会破坏 Kubernetes 的工具链。对 Afero 的一次错误审核可能会开启一个静默传播到下游所有环节的文件系统漏洞。

我创建 Cobra 是因为我需要为 Hugo 提供特定的 CLI 用户体验,而当时没有现成的库可以支持。我将它拆分为一个独立项目,想着其他人可能会觉得有用。我从未想过十年后我还在维护它,也没想到这两个项目会成为这么多人的关键基础设施。我只是想做些有用的东西,也许能交几个朋友。但开源意味着我有义务无限期地维护它吗?随着我发布的每个新项目,维护旧项目的时间就越来越少。有些 PR 已经等了三年了。在 Afero 的 BasePathFs 中有一个已报告的安全漏洞,自从 2025 年 6 月起就挂在那里——直到写这篇文章之前,我都还没意识到它在那里,因为积压工作太惊人了。

维护的数学逻辑行不通。这是一个众所周知的开源问题(相关 XKCD 漫画)。贡献的数量增长速度远超维护者的数量,且随着项目的复杂性和影响力的增加,审查每个 PR 所需的时间也在增长。有些项目能吸引志愿者维护者,但这又带来了新问题:没有人对全局负责,每个人都只挑选对自己重要的事情,剩下的就随它去。Cobra 故意设计得节奏缓慢——有太多的项目依赖它,不能草率合并任何内容——因此每次更改都需要更彻底的审查,而不是更少。我的许多其他项目则掉进了既被维护又被遗弃的灰色地带。我会将其描述为针对最关键路径优化的维护,但这种区别对八个月前提交了修复方案且从未得到回音的人来说,意义并不大。

这不仅仅是我的问题。GitHub 托管着超过 4.2 亿个仓库。我有幸成为 Secure Open Source Fund 首批资助对象的一员——这是一项真正产生了影响的投资。但即使在经过几个周期的扩展后,它也只覆盖了约 200 个项目。OpenSSF 每周扫描数百万个关键项目。Tidelift 向维护者支付报酬。把这些加起来,你也只覆盖了成千上万个项目。这虽然很有意义,但与实际的表面积相比只是杯水车薪。

百分之九十六的代码库包含开源组件,而它们赖以生存的基础是由盯着永远清不空的待办事项的人类维持的,他们思考着是否这就是他们最终耗尽精力或干脆停止查看的周末。随之而来的还有维护者的愧疚感——明知道人们指望着你的工作,而你却没有能力帮忙,但又无法撒手不管。

进入机器人时代

我一直在几个仓库里尝试 AI 工具——比如在 fileflow 上的 Jules 和在 pathologize 上的 AI 尝试,这些仓库依赖较少,有更多尝试空间。我也一直在 Afero 上运行 GitHub Copilot,它有更多依赖,但其模块化架构允许我扩展新后端而不触及其他项目依赖的关键路径。

我去了一次邮轮旅行。当我在海上时,Jules 还在继续工作,每天都会发起新的 PR,因为我还没来得及合并第一个。等我回到家时,这两个项目已经有了超过 120 个 PR。我抽出一个早晨来审核它们,却发现它们其实代表了大约五个不同的更改集,每个更改集都在几周内每天提交一次。PR 本身并没有错,Jules 确实发现了真实的问题。但没有一个 PR 是完全正确的;在合并之前,每个都需要修正。在 Jules 提供的指导下,我做了调整,总体方向显示出前景。但实验目前带来的维护工作量是增加了,而不是减少了:我必须核实这 120 个 PR 中每一个是否真的是重复的,然后才能关闭。本意是减少积压工作的工具,反而增加了积压。

Jules 发起的这些 PR 署名是我,而不是 Jules——这引发了关于归属和责任的问题。从仓库的角度看,我是这些更改的作者。但我一行代码都没写。如果其中一个补丁引入了 Bug 或漏洞,提交历史记录指向的是我。大多数贡献者政策在编写时并未考虑到这种情况,标准的 CLA(贡献者许可协议)也不区分人类编写的代码和人类指导 AI 编写的代码。

目前看来,Jules 似乎没有关于其之前工作的记忆,也没有检查未处理 PR 的能力。它扫描仓库,发现问题,发起 PR,然后停止。如果你不合并,Jules 下次扫描时会发现同样的问题并再次发起 PR。它没法知道你已经意识到了问题但还没合并,原因可能是:你不同意这个修复,或者修复优先级较低,或者你正在船上度假且两周内没法上网。这种语境对工具来说是不可见的。Jules 发现了一个真实的漏洞——文件操作中的 TOCTOU(检查时间到使用时间)漏洞——它是对的,它指出了这一点……指出了 12 次。

对于机械性的工作——标记问题、更新依赖、起草样板回复——这些工具确实非常有用。但 Jules 和 Copilot 无法告诉我,这 55 个 Afero 的 PR 中,是否有一个根本不属于这个项目。这种判断需要了解代码库的过去和未来,而不仅仅是它的现状。

这些工具只能基于可见的事物工作:代码、未解决的问题、PR 历史。维护者的约束条件是那些没人写下来的东西:内部辩论如何塑造了 API。人类判断力最无可替代、AI 最盲目的鸿沟,就在这两者之间。

曾和我一起在 Go 团队工作的 Russ Cox 在最近的一次关于 AI 贡献的讨论中说得很好:“人们吹嘘代码库有成百上千行,是由 AI 在创纪录的时间内完成并提交的。仔细观察会发现,这些代码库往往更像是跳舞的大象,而不是有用的工程产物。”

他是对的。但我一直在思考代码之外的事情。编写新软件和维护现有软件是有区别的。更新依赖并不是跳舞的大象。分拣一个陈旧的问题并不是创造性行为。告诉一个贡献者“谢谢,但我们不接受对这个 API 的更改”只是在维持运营。而现在,对于数百万个项目来说,灯已经熄灭了。

这还不是最大的挑战。大多数人没意识到的是,评估和合并更改比编写新代码要难得多。理解一个更改如何融入现有的代码库、它的历史以及它的计划,需要一部分隐形的知识——这些知识存在于创意工作中,需要某种目前没有模型能复制的判断力。

“受保护”到底保护了什么

Go 项目对我来说真的很美——那是运行了 15 年、极其细致的评审、设计讨论和精炼的评审文化。那是理想状态。但 Go 是个例外,大多数项目无法企及:由 Google 资助的全职贡献者,一项旨在持续 50 年且不受外部截止日期压力的任务。

Go 团队最近有一个长长的讨论,关于是否接受 AI 生成的贡献——Russ Cox 的名言也源自那个讨论。这些人我共事多年——同样的评审、同样的方案、在同样的白板前争论。阅读那个论坛线程,我能听到他们的声音。我能看到他们每个人是如何坚持自己认为正确的事情,以及为什么。

Rob Pike 第一个发言且毫不含糊。这是一条非常危险的道路。在你的第一步上要小心。我建议简单地说“不”。那是 Rob。直接、原则性强,且通常是正确的。然后 Alan Donovan 指出了不舒服的现实:“我怀疑我们今天收到的一大部分 CL(更改列表)已经包含了 LLM 生成的代码,无论作者是否承认。马已经跑出马厩了。”

Russ Cox 写下了我见过的最深思熟虑的回应。他的核心观点是:“我们能做的最重要的事情是维持我们平时的代码评审和代码质量标准……当代码的部分或全部是在 AI 工具的帮助下编写时,同样的标准必须适用。”以及:“当你使用 AI 工具完成工作时,你的责任并不会减轻。”

这些立场中的每一个都是合理的。每一个都基于一个假设,而这个假设揭示了困境的核心:他们假设有人类可以进行评审

Go 能负担得起“维持同样的标准”,因为它有全职贡献者。它能负担得起“直接说不”,因为 Go 有足够多的人对重要的事情说“是”。

Afero 没有。大多数开源项目没有。当 Rob Pike 说“不”时,Go 项目保持运行。当我说“不”时,PR 就挂在那里。那是不同种类的“不”。

这里有一个光谱,你落在哪里取决于你究竟在两者之间如何权衡。在实践中,维护者面临五个选项:

  1. 人类编写,人类审核。
  2. AI 编写,人类审核。
  3. 人类编写,AI 审核。
  4. AI 编写,AI 审核,人类点击合并。
  5. AI 编写,AI 审核,AI 点击合并。

列表中的每一步通常都是在用严谨性换取速度,用信任换取吞吐量。但对于大多数人类或 AI 都不评审的 PR,根本谈不上标准。

我们真正保护的是什么

当维护者评审贡献者的 PR 时,存在一个潜规则(契约)。贡献者投入数小时理解代码库、编写测试并提交干净的内容。评审者投入数小时进行评估、打回并提出改进建议。双方都在学习。评审者理解了项目的一个新角落。贡献者学会了更好地使用代码库的惯用法。这种关系形式。这种交流是使开源成为一个社区,而不仅仅是供应链的重要原因。

Bryan Cantrill 在 Oxide 描述了这种关于 LLM 使用的内部政策:通常,“读者和作者都默认,是编写者付出了更大的智力劳动。”当内容是 AI 生成时,“这个社会契约就变成了作者付出的努力最少。如果双方都没有付出努力,那么评审还有什么意义?”Oxide 的答案是,无论如何人类都要负责;工具不吸收责任。这是正确的直觉。但它假设有人真正在那里承担责任。

对于大多数项目,根本没有人在评审。社会契约不是被 AI 破坏的——它正被沉默破坏。六个月前提交了一个干净、测试完备的补丁却从未收到回音的贡献者,并没有体验到一个退化版的理想契约。他们什么也没体验到。

一个不完美的社会契约,是否好过一个从未发生的完美契约?

来自 AI 的在一天内的响应,可能比来自人类的永远的沉默更受尊重。

前方的实验

我决定弄清楚到底怎么回事。我在 Afero 上看到了 55 个尚未处理的 PR 请求,显然,这种拖延态度本身就已经构成了一种忽视行为。

AI 工具会让我更投入,让我从那些本不需要我的决策中解脱出来吗?还是会让我感觉连接更少——人类元素又减少了一层?我不知道让 AI 评审 PR 而不是人类评审是什么感觉,也不知道当双方的努力都减弱时,问责制是否还存在。这就是实验。

Russ 在那个讨论中还说了另一句话,我一直在回味:“最重要的事情是保持思考。工具让关掉大脑变得非常容易,但如果你小心避开那个陷阱,你就能产出好的成果。”这就是我要尝试走的路。让 AI 处理大量数据吧。而我自己则要继续负责做出正确的判断。

没有一个通用的政策可以同时适用于 Go 和 Afero。也不应该有。

受保护的分支依然受保护。我只是不再确定那究竟意味着什么。

你遇到过这种情况吗?我特别想听听那些尝试过使用人工智能进行代码审查的维护人员的意见——哪些方面运作正常,哪些又出现了问题。

原文地址:https://spf13.com/p/the-maintainers-dilemma/


今日互动探讨

“如果一个 AI 能够修复你项目中困扰已久的 Bug,但由于它是 AI 生成的,没有人能完全解释其每一步的逻辑,你会选择合并它吗?”

在开源社区的未来,我们究竟是在守护代码的质量,还是在守护人类参与的痕迹?欢迎在评论区分享你的看法。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「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