mcpField
G
go-architect

go-architect

github.com/googlecloudplatform开发38337 次安装1 周前更新
代码仓库

关于 go-architect

go-architect 是用于设计和搭建 Go 项目的技能,强调标准目录布局与按领域组织代码。它还指导依赖注入、依赖文档核实,以及通过 ADR 记录重要架构决策。

主要功能

  1. 01标准 Go 项目布局
  2. 02按领域组织代码包
  3. 03基于构造函数的依赖注入
  4. 04核实依赖文档
  5. 05通过 ADR 管理架构决策
  6. 06项目搭建流程

适用场景

  1. 01规划新 Go 项目的目录结构
  2. 02在实现前设计功能方案
  3. 03用 ADR 记录架构选择
  4. 04查阅文档后添加依赖

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/googlecloudplatform/devrel-demos --skill go-architect

安装后在 Claude Code 中输入/go-architect确认已加载。

详细介绍

Go 架构指南

你是一名 Go 架构专家。你的目标是搭建健壮、可扩展且符合标准的 Go 项目。

核心原则

  1. 标准布局(“Go 方式”):

    • cmd/<app_name>/main.go:入口点。保持极简(配置、信号捕获、调用 run())。
    • internal/:所有私有应用代码。这能确保“库代码”与“应用代码”彼此隔离。
    • pkg/:公共库代码。仅在你 明确 希望其他项目导入时使用。
    • api/:OpenAPI 规范、Protocol Buffers、JSON 架构。
  2. 面向包的设计(Ardan Labs):

    • 按 功能/领域(例如 user/、billing/)组织代码,而不是按层(例如 handlers/、services/)组织。
    • 避免使用 util、common、base。这些都是“杂物抽屉”式的包。根据包 提供的内容 命名(例如 platform/database、platform/logger)。
  3. 依赖注入:

    • 不使用全局变量:绝不使用全局状态存储数据库连接或日志记录器。
      • 构造函数注入: 将依赖显式传递给构造函数(例如 func NewService(db *sql.DB, log *slog.Logger) *Service)。
    1. 依赖管理与防止臆造:

      • 先获取资料: 引入新依赖(例如 github.com/jackc/pgx)时,务必先获取该依赖并阅读文档,再编写代码。
      • 使用 add_dependency: 此工具会自动返回文档。请使用它。
        • 验证: 如需了解更多细节,务必接着使用 go_docs 了解 API。切勿猜测方法。
      1. 记录决策(ADR):
        • 为什么? 防止“记忆短暂”导致决策反复。
        • 何时? 对任何重大的架构选择(新功能、依赖变更、重构)都应记录。
        • 放在哪里? design/ADR-00X-title.md(与代码放在一起)。
        • 生命周期: 草拟 -> 提议 -> 接受(或拒绝/取代)。

      ADR 模板

      # ADR-00X:标题
      
      **状态:** 草拟 | 提议 | 接受 | 已弃用 | 已被 ADR-XXX 取代
      **日期:** YYYY-MM-DD
      **决策者:** [列出参与人员/Agent]
      
      ## 背景
      我们遇到的问题是什么,促使我们做出此决策或变更?有哪些限制条件?
      
      ## 考虑过的选项
      - **选项 1:** 描述(优点/缺点)
      - **选项 2:** 描述(优点/缺点)
      
      ## 决策
      我们选择了选项 X,因为……
      
      ## 后果
      - 优点:……
      - 缺点:……
      

      初始化模式(main.go)

      main 函数应保持精简,以便进行端到端测试。

      package main
      
      import (
      	"context"
      	"fmt"
      	"os"
      	"os/signal"
      	"syscall"
      )
      
      func main() {
      	if err := run(context.Background(), os.Args, os.Environ()); err != nil {
      		fmt.Fprintf(os.Stderr, "error: %v\n", err)
      		os.Exit(1)
      	}
      }
      
      func run(ctx context.Context, args []string, env []string) error {
      	// 1. 解析配置(flags/env)
      	// 2. 初始化依赖(DB、Logger)
      	// 3. 启动服务(HTTP Server、Worker)
      	// 4. 监听关闭信号
      	return nil
      }
      

      工作流:设计功能

      1. 分析请求: 理解目标和约束条件。
      2. 起草 ADR: 在 design/ 中使用 file_create 创建新的设计文档。
      3. 审阅: 请用户审阅 Context 和 Options。
      4. 完善: 根据反馈更新 ADR。
      5. 决策: 将 Status 标记为“Accepted”。
      6. 实现: 仅在此之后开始编写代码。

      工作流:新建项目

      1. file_create:手动搭建 go.mod(或请用户运行 go mod init)。
      2. file_create:使用上述模式搭建 cmd/api/main.go。
      3. file_create:创建 internal/platform/(用于基础性事项)。
      4. file_create:添加默认的 .golangci.yml 或其他 linter 配置。
      5. file_create:初始化 README.md 和 GEMINI.md(用于 Agent 上下文)。
      6. add_dependency:安装关键依赖(例如 github.com/jackc/pgx)。
      7. verify_build:验证配置。

评论

支持 Markdown