Go mod 好菜系列 - 0x0C fx 这锅生命周期和装配更重一点

从模块化、生命周期、依赖装配和项目体量角度详细聊 fx,看看它为什么适合更重一点的服务项目,又为什么不该滥用。

如果说 wire 是“把装配代码在编译期生成出来”,那 fx 则更像是另一条路线:它不只是想帮你装配依赖,还想把模块、生命周期、启动和关闭过程也一起纳进来。也正因为这样,它比 wire 更重,也更看项目体量。

fx 在解决什么问题

它解决的不是“我能不能 new 出几个对象”,而是“一个服务型项目的组件怎么统一提供、统一装配、统一启动、统一关闭”。

也就是说,fx 关注的不只是依赖注入,还有:

  • 模块注册
  • 对象提供
  • 调用执行
  • 生命周期钩子

为什么它会显得比 wire 更重

因为它不只是一个生成器,而更像一个应用容器框架。你会更明显地感受到“项目有一层专门的装配和运行组织结构”。

一个很简化的感觉

app := fx.New(
    fx.Provide(
        NewConfig,
        NewLogger,
        NewDB,
        NewUserRepo,
        NewUserService,
        NewHTTPServer,
    ),
    fx.Invoke(RegisterRoutes),
)

app.Run()

这个写法的关键味道在于:你开始不是一个对象一个对象手动往下串了,而是把“谁提供什么、谁启动什么”集中交给了容器层。

生命周期是它特别值得注意的一点

func NewHTTPServer(lc fx.Lifecycle) *http.Server {
    srv := &http.Server{Addr: ":8080"}

    lc.Append(fx.Hook{
        OnStart: func(ctx context.Context) error {
            go srv.ListenAndServe()
            return nil
        },
        OnStop: func(ctx context.Context) error {
            return srv.Shutdown(ctx)
        },
    })

    return srv
}

这也是 fx 和很多“纯注入工具”最不一样的地方:它很关心服务怎么启动,也很关心服务怎么结束。

什么时候它特别合适

  • 项目组件很多
  • 服务生命周期复杂
  • 你需要模块化启动和关闭
  • 团队已经接受容器式组织方式

比如大型服务、平台型项目、多个基础设施组件同时参与启动时,fx 的优势会明显很多。

什么时候它会显得用力过猛

如果项目还很小、依赖层级不深、启动流程很简单,那 fx 很容易让人产生一种“服务还没复杂,装配先复杂了”的感觉。

这不是 fx 不好,而是它天然就更适合中大型服务,而不是所有 Go 项目的默认起手式。

fx 和 wire 的区别怎么粗暴理解

  • wire 更偏编译期装配工具
  • fx 更偏应用级装配和生命周期框架

两者都在解决“依赖怎么组织”的问题,但 fx 管得更宽,代价也更重。

小结

fx 这道菜更适合项目已经开始往平台化、模块化方向长的时候:

  • 它不只管依赖装配,还管生命周期
  • 特别适合启动和关闭都比较复杂的服务
  • 项目小时很容易显重
  • 它更像“整套餐具”,不是一把小勺子

到这里,第二批 Go mod 好菜系列 就算补上了一条新的分支:从参数校验、JWT,到 sqlx、ent,再到 wire 和 fx,基本把“常用库”和“工程装配”这两条线都接起来了。

Read more

Harness Engineering:从驾驭模型到构建 AI 工厂

Harness Engineering:从驾驭模型到构建 AI 工厂

2026 年,AI 编程工具的竞争焦点发生了根本性转变:决定 AI 助手好不好用的,不再是模型本身,而是包裹在模型外面的那层"Harness"。同一个模型,在不同的 Harness 下,性能差距可以达到 78% vs 42%。 这篇文章将带你深入了解 Harness Engineering——这个正在重新定义 AI 工程实践的新兴领域。 一、什么是 Harness Engineering? Harness 的字面意思是"马具/缰绳"——用来驾驭一匹强壮但不受控的马。在 AI 语境下,Harness 就是 LLM 之外的一切:工具定义、记忆系统、权限模型、反馈循环、文档规范、多

By Fuyu Jia

Claude Code CLI + Ralph:让 AI 自动完成大型编程任务的终极方案

TL;DR 当你的编程任务大到一个 AI 对话窗口装不下时,Ralph 会帮你把任务拆成小块,让 Claude Code CLI 一个接一个地自动完成——每轮都用全新的上下文窗口,不会越写越糊涂。 一、什么是 Ralph? Ralph 是一个开源项目(GitHub 16k+ Stars),基于 Geoffrey Huntley 提出的 "Ralph Pattern" 构建。它的核心理念很简单: 不要让 AI 在一个漫长的会话里做完所有事情,而是把大任务拆成小故事,每个故事用一个全新的 AI 实例来完成。 这解决了 AI 编程中最常见的痛点——上下文窗口耗尽。当对话越来越长,AI 的输出质量会明显下降。Ralph 通过「每轮一个新实例」的方式,

By Fuyu Jia