SuperAPI AI 工具集

go-setup

编程与开发

查看项目

更新于 10-30 16:18

技能介绍

用途

go-setup 是一个面向 Go 项目初始化的技能,用于在启动新 Go 项目时提供项目结构决策、库选择、架构规划与配置设置方面的指导。当需要新建 Go 项目、决定项目结构、选择库与依赖、搭建构建工具与配置时可以使用它。

主要能力

该技能覆盖 Go 项目初始化与设置,包括:项目结构决策、库选择、架构规划、配置设置。

项目结构参考

详细的结构指南被拆分为多个聚焦的参考文件:

  • CLI / TUI 应用:简单 CLI、支撑包、使用 Bubble Tea 的 TUI
  • 单服务:基础服务、带数据库的服务、服务层职责
  • Monorepo:go.work、多服务 justfile、CI
  • 混合:CLI + 服务 + 共享包的组合布局
  • 推荐库:核心、CLI/TUI、数据库、并发、测试、构建工具

常用命令

just build          # Build binary
just run            # Run application
just dev            # Run with hot reload

just check          # vet + test-unit + lint
just lint           # golangci-lint
just test-unit      # Unit tests only
just test-all       # All tests

just migrate-up     # Apply migrations
just migrate-down   # Rollback migrations
just sqlc           # Generate SQL code

标准 justfile 模板

# Variables
binary := "myapp"
main := "./cmd/server"

# Default recipe (runs with just `just`)
default: build

# Build binary
build:
    go build -o bin/{{binary}} {{main}}

# Run application
run:
    go run {{main}}

# Development with hot reload (requires air)
dev:
    air

# Run all checks
check: lint test

# Run linter
lint:
    golangci-lint run ./...

# Run unit tests
test:
    go test -v -race ./...

# Run unit tests with coverage
test-coverage:
    go test -v -race -coverprofile=coverage.out ./...
    go tool cover -html=coverage.out -o coverage.html

# Run integration tests
test-integration:
    go test -v ./test/integration/...

# Run E2E tests
test-e2e:
    go test -v ./test/e2e/...

# Run all tests
test-all: test test-integration test-e2e

# Database migrations
migrate-up:
    migrate -path ./db/migrations -database "$DATABASE_URL" up

migrate-down:
    migrate -path ./db/migrations -database "$DATABASE_URL" down

# Generate SQL code
sqlc:
    sqlc generate

# Clean build artifacts
clean:
    rm -rf bin/
    rm -f coverage.out coverage.html

# Install binary to GOPATH
install:
    go install {{main}}

配置

环境变量(推荐):

package config

import "github.com/caarlos0/env/v11"

type Config struct {
    Port         int    `env:"PORT" envDefault:"8080"`
    DatabaseURL  string `env:"DATABASE_URL" envRequired:"true"`
    LogLevel     string `env:"LOG_LEVEL" envDefault:"info"`
    JWTSecret    string `env:"JWT_SECRET" envRequired:"true"`
}

func Load() (*Config, error) {
    cfg := &Config{}
    if err := env.Parse(cfg); err != nil {
        return nil, err
    }
    return cfg, nil
}

.env 文件(仅开发环境):

# .env (gitignored)
DATABASE_URL=postgres://user:pass@localhost:5432/mydb
JWT_SECRET=dev-secret
LOG_LEVEL=debug
PORT=8080

关键原则

来自官方 Go 文档:

  • 从简开始——小型项目单个 main.go 即可
  • 使用 internal/ 存放私有包(由编译器强制)
  • 使用 cmd/ 存放多个二进制文件
  • 仅在包需要被他人导入时使用 pkg/
  • 绝不使用 /src——这是 Java 模式,不是 Go 模式

常见错误

不要 应该
创建 /src 目录 使用根目录或 cmd/
对小项目过度工程 从简开始,逐步演进
仅为组织文件而创建包 为逻辑边界创建包
照搬 Java/Python 结构 遵循 Go 惯例
过早抽象 等到需要时再抽象

何时创建新包

在以下情况创建新包:

  • 代码需要在多处复用
  • 希望强制代码之间的边界
  • 作为“黑盒”可降低认知负担

不要仅为以下目的创建包:

  • 组织文件
  • 减小文件体积
  • 匹配其他语言的结构

初始化检查清单

启动新 Go 项目时:

  • 初始化 go module:go mod init github.com/org/project
  • 根据项目类型选择结构
  • 添加 justfile
  • 配置 golangci-lint
  • 设置 CI/CD(GitHub Actions)
  • 添加 .gitignore
  • 创建 README.md
  • 设置数据库迁移(如需要)
  • 配置 sqlc(如使用)
  • 添加基础测试

Go 的 .gitignore

# Binaries
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/

# Test
*.test
*.out
coverage.out

# Go workspace
go.work
go.work.sum

# Environment
.env
.env.local
*.env

# IDE
.idea/
.vscode/
*.swp
*.swo

# Build
dist/

CI/CD 示例(GitHub Actions)

name: CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - uses: actions/setup-go@v5
        with:
          go-version: '1.22'
      
      - uses: extractions/setup-just@v2
      
      - name: Download dependencies
        run: go mod download
      
      - name: Run checks
        run: just check
      
      - name: Run all tests
        run: just test-all

CI 注意事项:

  • just 并未预装在 GitHub runner 上。需添加 extractions/setup-just@v2,或直接调用底层命令(go vet、golangci-lint run);假设存在 just 的工作流会在首次运行时因 command not found(退出码 127)而失败。
  • 在首批真实代码落地前,为配方添加守卫(find . -name '*.go' | grep -q . → 跳过并输出消息),并将 lint/vet/test 步骤标记为 continue-on-error:golangci-lint 在空模块上会以非零退出,导致仅有文档和规划文件的仓库 CI 失败。
  • 将环境相关的检查(机器本地路径、个人工具链 linter)保留在本地 git hooks 中,而非 CI。CI runner 缺少这些检查所探测的 home 目录状态。

相关技能

设置完成后,可使用以下技能进行开发:

  • go-dev——Go 开发模式与最佳实践
  • go-fluent-testing——单元/集成/E2E 测试(fluent Given/When/Then)

适用场景

适用于新建 Go 项目、决定项目结构、选择库与依赖、搭建构建工具与配置等场景。

限制

资料未提供该技能的收费、价格、平台支持范围等具体信息。