用途:编写简洁、显式、可并发的 Go 代码,适用于创建或审查 Go 项目、库与 CLI。
主要能力:强调小接口放在边界、错误作为值处理;涉及 HTTP Gin 可参考 golang-apis,重并发参考 golang-goroutines,测试参考 golang-unit-testing,生产实践参考 golang-production。
工具链:新代码使用 Go 1.25+,同时尊重 go.mod 的 go directive;使用 gofmt / goimports、go vet、go test ./...;模块用 go get、go mod tidy,生产环境不要遗留 replace;若 CI 已用 golangci-lint 则沿用,不要在新功能中强加新配置。
组织方式:cmd/myapp/main.go、internal/、pkg/(仅当对外公开 API 时)、go.mod;internal/ 放不应被模块外导入的代码;main 保持精简,处理 flags/env、装配与 os.Exit;按领域而非类型(models、utils)分包。
语言要点:参数接受接口,返回具体 struct;错误用 fmt.Errorf("...: %w", err),用 errors.Is / As 比较,不要 _ = err,哨兵错误(ErrNotFound)放在所属包;slices 注意 append 别名,使用 slices / maps 标准库;项目 Go 1.23+ 且能改善 API 时可用迭代器(range over func);封闭枚举用 iota,边界避免魔法字符串;零值可用,必要时用 NewX 保证不变量。
Context:I/O 与 RPC 的第一个参数为 context.Context;不要把 ctx 存入 struct(短生命周期且已文档化的请求作用域除外);用 WithCancel / WithTimeout 派生,关闭时取消;ctx 值仅用于请求作用域(如 trace id),不用于依赖注入。
并发:不要无生命周期计划地 go(用 errgroup、wait、shutdown);共享 map 必须加锁;用 go test -race 检查竞态。
测试与质量:在 _test 包中做表驱动测试;端口用 fake,HTTP 边界用 httptest。
反模式:库中因用户输入 panic;init() 做网络 I/O;为保险起见定义 15 个方法的接口;在本技能中假定 Gin/gin.Context;无理由使用 interface{} / any;HTTP 客户端忽略 context。
完成标准:包结构清晰、错误已包装、I/O 边界有 ctx、通过 gofmt + vet、关键路径有测试、外部输入不 panic、不强加 HTTP/SQL 依赖。