plugins/languages/golang/skills/structure/SKILL.md
Go 项目结构规范——三层架构(API → Impl → State)、全局状态模式、internal/ 私有包、cmd/ 仅 main.go、go.work 多模块、禁止 Repository 接口和 DI 容器、struct 公共字段开头全 omitempty、handler var rsp 顶声明、禁 legacy migration。设计项目骨架、新建目录、组织包、做架构评审时触发。
npx skillsauth add lazygophers/ccplugin golang-structureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
api 不能被 impl 引用、impl 不能被 state 引用。service/、repository/、model/、config/、test/ 目录cmd/ 下放子包(仅 main.go)preMigrateLegacy 等)server/
├── go.mod
├── go.sum
├── Makefile
├── .golangci.yml
├── config.yaml
├── internal/
│ ├── state/
│ │ ├── table.go # 全局数据模型 var User/Friend/...
│ │ ├── config.go # var Config *AppConfig
│ │ ├── database.go # var DB *gorm.DB
│ │ ├── cache.go # var Cache *Cache
│ │ └── init.go # 统一初始化入口
│ ├── impl/
│ │ ├── user.go
│ │ ├── user_test.go
│ │ ├── friend.go
│ │ └── friend_test.go
│ ├── api/
│ │ └── router.go
│ └── middleware/
│ ├── auth.go
│ ├── logger.go
│ └── error.go
└── cmd/
└── main.go
package state
var (
DB *gorm.DB
Cache *Cache
Config *AppConfig
User *db.Model[User]
Friend *db.Model[Friend]
Message *db.Model[Message]
)
state/init.go 统一初始化,main 只调一次 state.Init()。package impl
func UserLogin(ctx *fiber.Ctx, req *LoginReq) (*LoginRsp, error) {
user, err := state.User.NewScoop().
Where("username", req.Username).
First()
if err != nil {
log.Errorf("err:%v", err)
return nil, err
}
return &LoginRsp{User: user}, nil
}
state.Xxx,无 mocks 注入。测试时 state.User = mock 临时替换。func XxxYyy(ctx, *Req) (*Rsp, error)。package api
func SetupRoutes(app *fiber.App) {
pub := app.Group("/api", middleware.OptionalAuth, middleware.Logger)
pub.Post("/Login", impl.ToHandler(impl.UserLogin))
priv := app.Group("/api", middleware.Auth, middleware.Logger)
priv.Post("/GetUserProfile", impl.ToHandler(impl.GetUserProfile))
}
go 1.26
use (
./server
./shared
./tools
)
仅在多个独立可发布模块共仓时用。单模块项目不需要。
| 场景 | 选择 |
| --- | --- |
| 简单 API、追求最小依赖 | 标准库 net/http + Go 1.22+ 增强路由 |
| 团队主流、生态最大 | Gin |
| 内置完整、清晰 API | Echo |
| 极致 QPS、可接受 fasthttp 锁定 | Fiber |
| 标准库可组合中间件 | Chi |
参考:JetBrains 2026 调查 Gin 48% / Gorilla 17% / Echo 16% / Fiber 11%。本项目 lazygophers 生态默认 Fiber。
type UserLoginReq struct {
// 1. 标识字段
Id uint64 `json:"id,omitempty"`
Username string `json:"username,omitempty"`
// 2. 业务字段
Password string `json:"password,omitempty"`
Email string `json:"email,omitempty"`
// 3. 状态/枚举
State uint8 `json:"state"`
// 4. 时间戳
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
json tag + omitempty(状态/时间除外,零值有意义)func UserLogin(req *UserLoginReq) (*UserLoginRsp, error) {
var rsp UserLoginRsp
user, err := state.User.NewScoop().
Where("username", req.Username).
First()
if err != nil {
log.Errorf("err:%v", err)
return nil, err
}
rsp.Token = generateToken(user.Id)
rsp.User = user
return &rsp, nil
}
var rsp XxxRsp 函数顶声明return &rspreturn &XxxRsp{Field: val}| AI 借口 | 实际应验证 | | --- | --- | | "Repository 接口好测试" | 用全局 state? | | "service/ 目录清晰" | service 在 impl/ 中? | | "config/ 单独管理" | 配置在 state/? | | "model/ 分离数据" | 模型在 state/? | | "cmd/ 多子命令" | cmd 仅 main.go? | | "DI 框架灵活" | 全局变量而非 DI? | | "指针区分零值和缺失" | omitempty + 零值=不传? | | "字面量构造更简洁" | var rsp 顶声明? | | "兼容迁移更安全" | 禁 legacy migration? |
internal/state/internal/impl/internal/api/internal/middleware/cmd/ 仅 main.gotools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。