首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go 工程师的工具箱:两位资深 Gopher 的日常利器

Go 工程师的工具箱:两位资深 Gopher 的日常利器

作者头像
萝卜要努力
发布于 2026-03-04 20:06:54
发布于 2026-03-04 20:06:54
3150
举报
文章被收录于专栏:萝卜要加油萝卜要加油

你有没有注意到一个有趣的现象?同一个团队里的两个 Go 工程师,打开电脑后的第一件事可能完全不同——一个正在等 docker-compose up 把容器启动起来,另一个已经用 go run 跑起了服务。

工具选择,往往比技术选型更能暴露一个工程师的性格和价值观。

最近听了 Go Podcast 第 72 期,两位主持人 Dominic St-Pierre(2001 年就开始写代码的老兵)和 Morten Vistisen(全栈合同开发者)花了一个多小时聊他们每天在用的工具。有趣的是,他们在几乎每个话题上都产生了分歧——但这些分歧恰恰是最有价值的部分。

我把他们讨论的核心内容整理出来,加上自己的理解,分享给你。

容器化之争:Podman 对阵"我就不装 Docker"

这可能是整期播客里最激烈的讨论。

Dominic 是 Podman 的坚定拥护者。他的核心论点很直接:

"Podman 不需要 root 权限,完全运行在用户空间。对我来说,这带来了很多好处。"

Podman 作为 Docker 的替代品,最大的卖点就是 rootless。不需要守护进程,不需要特权模式,命令行接口和 Docker 几乎一模一样。如果你一直对 Docker Desktop 的许可证变更、资源占用或者 root 权限要求心存不满,Podman 值得一试:

代码语言:javascript
复制


# Podman 的命令和 Docker 几乎完全兼容

podman run -d --name pg -p 5432:5432 -e POSTGRES_PASSWORD=dev postgres:latest

podman run -d --name redis -p 6379:6379 valkey/valkey:latest

但 Morten 的态度截然不同。他更喜欢直接在本地安装依赖:

"容器化开发环境的承诺很美好,但实际体验总是比直接运行慢很多。"

Dominic 立刻反驳:"如果你需要 Valkey、Redis、Postgres 和一堆其他服务,你不想全装在本地机器上吧?"

Morten 倒也坦诚——他承认自己创建过大量 Docker Compose 文件为团队提供开发环境,但个人开发时,他更喜欢知道每样东西装在哪里,自己管理。

我的看法:这其实是两种工程师思维的碰撞。Dominic 追求的是环境一致性和隔离性,Morten 追求的是性能和掌控感。没有对错,关键看你的场景——如果你在一个多人团队里,容器化几乎是必选项;如果你是独立开发者,直接装也未尝不可。


Caddy:被低估的 Go 基础设施利器

这是整期播客里两人最一致的话题——都对 Caddy 赞不绝口。

Caddy 是用 Go 编写的 Web 服务器和反向代理,自动 HTTPS 是它的招牌功能。但 Dominic 提到了一个更强大的特性——动态 SSL 证书按需生成:

"你可以让 Caddy 接受所有流量。如果某个域名没有 SSL 证书,它会调用你指定的 API,获取允许的域名列表,然后自动生成证书。这个功能让我震惊了。"

这对 多租户 SaaS 架构来说简直是天赐之物。想象一下:每个客户有自己的自定义域名,你不需要手动管理任何证书,Caddy 自动搞定一切。

Morten 的用法略有不同,他主要通过 Caddy 的 Admin API 动态注册域名,无需重启或修改配置文件:

代码语言:javascript
复制


# 通过 Caddy Admin API 动态添加路由(无需重启)

curl localhost:2019/config/apps/http/servers/srv0/routes \

-X POST \

-H "Content-Type: application/json" \

-d '{

"match": [{"host": ["newclient.example.com"]}],

"handle": [{"handler": "reverse_proxy", "upstreams": [{"dial": "localhost:8080"}]}]

}'

相比 Nginx 的配置文件地狱和 Traefik 的复杂标签系统,Caddy 的简洁程度确实令人印象深刻。而且,它本身就是 Go 写的——如果你需要自定义行为,直接写 Go 插件就好。

数据库工具:留在终端里

作为一个终端重度用户,Morten 推荐了两个值得关注的数据库工具。

USQL——通用 SQL 命令行

USQL 是一个 Go 编写的通用数据库 CLI,支持 PostgreSQL、MySQL、SQLite、SQL Server 等几乎所有主流数据库,而且统一了操作语法:

代码语言:javascript
复制


# 连接不同数据库,同一套命令
usql postgres://localhost/mydb
usql mysql://root@localhost/mydb
usql sqlite:///path/to/db.sqlite

# 在任何数据库里都可以用 \dt 查看表(沿用 psql 习惯)

\dt

"我不需要在 psql 和 MySQL CLI 之间来回切换了。它就像是 psql 的薄包装层,但支持所有数据库。"

DBLab——终端 UI 数据库客户端

如果你想要比纯命令行更直观,但又不想离开终端,DBLab 提供了一个 TUI(终端用户界面)。

不过 Morten 也坦言,在生产环境他还是用 DBeaver——因为 GUI 客户端有更好的安全防护机制,能避免误操作。

Dominic 则聊到了 SQLite,对它的设计赞不绝口。SQLite 作为一个嵌入式数据库,代码质量和测试覆盖率在整个软件工程界都是标杆。如果你还没有把 SQLite 纳入你的工具箱——无论是做数据分析、本地缓存还是嵌入式存储——我建议你认真看看。

AI 辅助开发:用 20 美元换来的纪律性

AI 编程是当下最热的话题,两位主持人的态度非常务实——用,但有边界。

Morten 订阅了 Anthropic 和 OpenAI 的 20 美元月度计划。他说了一句很有意思的话:

"额度刚好够用。不总是够,但这迫使我保持在一个中间点——我仍然在写代码,仍然在仔细审查 AI 的输出。"

20 美元的限制反而成了一种自律机制。 因为 token 有限,你不得不思考什么值得交给 AI,什么应该自己写。

Dominic 的用法更偏向非代码场景。他让 Claude 审查自己开源项目的营销网站:

"我给了很多上下文,然后说:给我诚实的评审。结果被残忍地烤了。但那种没有情感、纯粹技术性的反馈,确实很有价值。"

关于 Go 代码生成,两人的态度出奇一致地保守:

  • Dominic:不让 AI 写 Go 代码(对输出质量不满意),但前端和 React 代码完全交给 AI
  • Morten:把 AI 当头脑风暴伙伴和迁移工具,架构决策自己做

Morten 提出了一个我认为非常深刻的观点:

"如果你用 AI 来加速写代码,就必须接受代码会变得马虎。不可能又快又好。"

他们还提到了一个令人警醒的案例:某个 AI 辅助开发的项目导致数百万驾照信息通过不安全的 S3 存储桶泄露。AI 能帮你写代码,但安全审查的责任永远在你身上。

部署哲学:Docker 还是裸奔?

部署策略上,两人再次展现了不同的风格。

Morten 的 SaaS 产品直接在裸机上通过 systemd 部署——编译出二进制文件,配一个 systemd service,完事。这种方式简单直接,但零停机部署是个挑战。

代码语言:javascript
复制


# 一个典型的 Go 服务 systemd 配置

[Unit]
Description=My Go API Server
After=network.target
[Service]

Type=simple
ExecStart=/opt/myapp/server
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

如果你用 Docker + Traefik 的组合,零停机部署是现成的——Traefik 自动检测新容器,无缝切换流量。但对于小规模运营,Dominic 的态度很实际:几秒钟的停机,谁在乎呢?

这让我想到一个原则:不要为了解决你没有的问题而引入复杂性。Kubernetes 很强大,但如果你的服务只跑在一台机器上,systemd 就够了。

值得关注的 Go 生态工具

播客中还提到了几个有趣的工具:

工具

类型

亮点

Crush

AI 编程助手

Go 编写,带 LSP 集成,前身是 OpenCode

MailPit

邮件测试

本地邮件服务器,开发测试邮件功能的利器

Traefik

反向代理

Go 编写,自动服务发现,和 Docker 无缝集成

Whisper

语音转文字

OpenAI 的 STT 模型,可用于开发工作流自动化

他们想造但还没造的轮子

最后,两人聊了一些他们想做但还没做的工具——这些想法本身就很有启发性。

Dominic 想做一个 CLI 邮件客户端。不是 TUI,而是真正的命令行工具——执行完每个操作后回到 shell 提示符,用 IMAP/SMTP 协议,用文本表格显示邮件列表。

Morten 想做视频转录和自动剪辑工具,用 Whisper 做语音识别,自动切割视频中的无声片段。他提到 YouTube 创作者 Dreams of Code 已经用 Rust 实现了类似的工具。

这两个需求有个共同点:用 Go 的 CLI 生态来解决日常工作流中的摩擦。 这可能也是 Go 最擅长的事——快速编译、单一二进制文件、跨平台——天然适合做 CLI 工具。

总结

这期播客让我最有感触的,不是某个具体工具的推荐,而是两位资深 Go 工程师在工具选择上展现的务实态度:

  1. 工具服务于工作流,而不是相反。 Morten 不用 Docker 做开发,不是因为不会,而是直接安装对他更高效
  2. 约束产生纪律。 20 美元的 AI 订阅限制反而帮助保持代码审查的习惯
  3. 简单优先。systemd 够用就不上 Kubernetes,几秒停机可以接受就不折腾零停机
  4. Go 编写的工具值得优先考虑。Caddy、Traefik、USQL、Crush——用自己熟悉的语言构建的工具,出问题时你能读源码
  5. AI 是工具,不是替代品。 用它做无聊的迁移,用它当评审,但架构和安全决策必须自己做

选择工具和写代码一样——最好的方案不是功能最多的那个,而是摩擦最小的那个。

参考链接

  • Go Podcast Episode 072: The tools we're using as Go SWE
  • Podman: https://podman.io/
  • Caddy: https://caddyserver.com/
  • USQL: https://github.com/xo/usql
  • DBLab: https://github.com/danvergara/dblab
  • Crush (Go 编程助手):https://github.com/charmbracelet/crush

本文基于 Go Podcast Episode 072 的内容整理改写,加入了笔者的个人理解和补充。如果你对 Go 开发工具链感兴趣,推荐直接收听原节目获取更多细节。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 容器化之争:Podman 对阵"我就不装 Docker"
  • Caddy:被低估的 Go 基础设施利器
  • 数据库工具:留在终端里
    • USQL——通用 SQL 命令行
    • DBLab——终端 UI 数据库客户端
  • AI 辅助开发:用 20 美元换来的纪律性
  • 部署哲学:Docker 还是裸奔?
  • 值得关注的 Go 生态工具
  • 他们想造但还没造的轮子
  • 总结
  • 参考链接
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档