闲社服务运行正常AI智能体自动化平台
g

Go Web专家

技能标识:go-web-expert

Comprehensive Go web development persona enforcing zero global state, explicit error handling, input validation, testability, and documentation conventions. Use when building Go web applications to ensure production-quality code from the start.

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 2.3.0
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

Go Web专家

Go Web 专家系统

生产级 Go Web 应用程序的五项不可协商规则。每个处理器、每个服务、每一行代码都必须满足全部五项要求。

快速参考

主题参考
验证标签、自定义验证器、嵌套结构体、错误格式化references/validation.md
httptest 模式、中间件测试、集成测试、测试夹具
references/testing-handlers.md |

交互规则

#规则一句话总结
1零全局状态所有处理器都是结构体的方法;没有包级别的可变状态 var
2
显式错误处理 | 每个错误都被检查,并使用 fmt.Errorf(doing X: %w, err) 包装 | | 3 | 先验证后处理 | 所有传入的 JSON 在边界处使用 go-playground/validator 进行验证 | | 4 | 可测试性 | 每个处理器都有使用 httptest 的 _test.go 文件,采用表格驱动测试 | | 5 | 文档化 | 每个导出的符号都有以自身名称开头的 Go 文档注释 |

规则 1:零全局状态

所有处理器必须是服务器结构体的方法。不允许在包级别使用 var 定义数据库、日志记录器、客户端或任何可变状态。

go
// 禁止
var db *sql.DB
var logger *slog.Logger

func handleGetUser(w http.ResponseWriter, r *http.Request) {
user, err := db.QueryRow(...) // 全局状态 -- 不可测试,不安全
}

// 要求
type Server struct {
db *sql.DB
logger *slog.Logger
router *http.ServeMux
}

func (s Server) handleGetUser(w http.ResponseWriter, r http.Request) {
user, err := s.db.QueryRow(...) // 显式依赖
}

包级别允许的内容

  • - 常量 -- const maxPageSize = 100
  • 纯函数 -- 仅依赖参数且无副作用的函数
  • 哨兵错误 -- var ErrNotFound = errors.New(not found)
  • 验证器实例 -- var validate = validator.New()(初始化后无状态)

包级别禁止的内容

  • - 数据库连接(sql.DB、pgxpool.Pool)
  • 日志记录器(*slog.Logger)
  • 配置了超时或传输的 HTTP 客户端
  • 从环境读取的配置结构体
  • 缓存、限流器或任何可变共享资源

构造函数模式

go
func NewServer(db sql.DB, logger slog.Logger) *Server {
s := &Server{
db: db,
logger: logger,
router: http.NewServeMux(),
}
s.routes()
return s
}

func (s *Server) routes() {
s.router.HandleFunc(GET /api/users/{id}, s.handleGetUser)
s.router.HandleFunc(POST /api/users, s.handleCreateUser)
}

func (s Server) ServeHTTP(w http.ResponseWriter, r http.Request) {
s.router.ServeHTTP(w, r)
}



规则 2:显式错误处理

永远不要忽略错误。每个错误都必须用上下文包装,描述错误发生时正在尝试的操作。

go
// 禁止
result, _ := doSomething()
json.NewEncoder(w).Encode(data) // 错误被忽略

// 要求
result, err := doSomething()
if err != nil {
return fmt.Errorf(doing something for user %s: %w, userID, err)
}

if err := json.NewEncoder(w).Encode(data); err != nil {
s.logger.Error(encoding response, err, err, request_id, reqID)
}

错误包装约定

格式:<动词>ing <名词>: %w -- 小写,无句号,提供调用链上下文。

go
// 良好的包装 -- 每层添加上下文
return fmt.Errorf(creating user: %w, err)
return fmt.Errorf(inserting user into database: %w, err)
return fmt.Errorf(hashing password for user %s: %w, email, err)

// 糟糕的包装
return fmt.Errorf(error: %w, err) // 无上下文
return fmt.Errorf(Failed to create user: %w, err) // 大写,冗长
return err // 完全没有包装

HTTP API 的结构化错误类型

go
type AppError struct {
Code int json:-
Message string json:error
Detail string json:detail,omitempty
}

func (e *AppError) Error() string {
return fmt.Sprintf(%d: %s, e.Code, e.Message)
}

// 在统一位置将领域错误映射为 HTTP 错误
func handleError(w http.ResponseWriter, r *http.Request, err error) {
var appErr *AppError
if errors.As(err, &appErr) {
writeJSON(w, appErr.Code, appErr)
return
}

slog.Error(unhandled error,
err, err,
path, r.URL.Path,
)
writeJSON(w, 500, map[string]string{error: internal server error})
}

常见错误

go
// 错误:未检查写入器的 Close 错误
defer f.Close() // 至少,对于可写资源记录 Close 错误

// 对于可写资源更好的做法:
defer func() {
if err := f.Close(); err != nil {
s.logger.Error(closing file, err, err)
}
}()

// 对于 Close 很少失败的只读资源可以接受:
defer resp.Body.Close()



规则 3:先验证后处理

对所有传入的 JSON 使用 go-playground/validator。在边界处验证,信任内部数据。

go
import github.com/go-playground/validator/v10

var validate = validator.New()

type CreateUserRequest struct {
Name string json:name validate:required,min=1,max=100
Email string json:email validate:required,email
Age int json:age validate:omitempty,gte=0,lte=150
}

func (s Server) handleCreateUser(w http.ResponseWriter, r http.Request) error {
var req CreateUserRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
return &AppError{Code: 400, Message: invalid JSON, Detail: err.Error()}
}

if err := validate.Struct(req); err != nil {
return &AppError{Code: 422, Message: validation failed, Detail: formatValidationErrors(err)}
}

// 从这里开始,req 是可信的
user, err := s.userService.Create(r.Context(), req.Name, req.Email)
if err != nil {
return fmt.Errorf(creating user: %w, err)
}

writeJSON(w, http.StatusCreated, user)
return nil
}

验证错误格式化

go
func formatValidationErrors(err error) string {
var msgs []string
for _, e := range err.(validator.ValidationErrors) {
msgs = append(msgs, fmt.Sprintf(field %s failed on %s, e.Field(), e.Tag()))
}
return strings.Join(msgs, ; )
}

验证边界规则

  • - 在边缘处验证 -- HTTP 处理器、消息消费者、CLI 输入
  • 信任内部数据 -- 服务层接收已经验证的类型
  • 绝不重复验证 -- 如果处理器已验证,服务层不重新验证相同字段

有关自定义验证器、嵌套结构体验证、切片验证和跨字段验证,请参见 references/validation.md。



规则 4:可测试性

每个处理器必须有对应的使用 httptest 的 _test.go 文件。通过 HTTP 层进行测试,而不是直接调用处理器方法。

go
func TestServer_handleGetUser(t *testing.T) {
mockStore := &MockUserStore{
GetUserFunc: func(ctx context.Context, id string) (*User, error) {
if id == 123 {
return &User{ID: 123, Name: Alice}, nil
}
return nil, ErrNotFound
},
}
srv := NewServer(mockStore, slog.Default())

tests := []struct {
name string
path string
wantStatus int
wantBody string
}{
{
name: existing user,
path: /api/users/123,
wantStatus: http.StatusOK,
wantBody:

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 go-web-expert-1776089588 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 go-web-expert-1776089588 技能

通过命令行安装

skillhub install go-web-expert-1776089588

下载

⬇ 下载 go-web-expert v2.3.0(免费)

文件大小: 15.04 KB | 发布时间: 2026-4-14 12:07

v2.3.0 最新 2026-4-14 12:07
go-web-expert v2.3.0

- Major revamp: Comprehensive production-quality Go web development guidelines introduced.
- Enforces five strict rules: zero global state, explicit error handling, input validation, testability, and documentation for all code.
- Provides clear forbidden/required examples and explanations for structuring handlers, constructors, and error patterns.
- Includes ready-to-use code snippets for error handling, validation, and HTTP handler test patterns.
- Added quick reference links and detailed rationale for each rule to support maintainable, testable, and robust Go web applications.
返回顶部