跳转到内容

goctl 常见问题

如何添加自定义逻辑而不被重新生成覆盖?

Section titled “如何添加自定义逻辑而不被重新生成覆盖?”

goctl 只在 logic 文件不存在时才生成桩代码,永远不会覆盖 internal/logic/ 中的已有文件。对已有项目重新运行 goctl api go 是安全的——只会创建缺失的文件。

使用 --style 参数:

Terminal window
goctl api go -api user.api -dir . --style go_zero
# 生成:user_handler.go, create_user_logic.go 等

可选值:gozero(默认)、go_zerogoZero

go-zero 不包含内建校验器。可以使用 go-playground/validator

import "github.com/go-playground/validator/v10"
var validate = validator.New()
func (l *CreateUserLogic) CreateUser(req *types.CreateUserReq) (*types.CreateUserResp, error) {
if err := validate.Struct(req); err != nil {
return nil, errorx.NewCodeError(400, err.Error())
}
// ...
}

定义一个错误包:

package errorx
type CodeError struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
func (e *CodeError) Error() string { return e.Msg }
func NewCodeError(code int, msg string) *CodeError {
return &CodeError{Code: code, Msg: msg}
}

然后在 main.go 中注册自定义错误处理器:

httpx.SetErrorHandler(func(err error) (int, any) {
var ce *errorx.CodeError
if errors.As(err, &ce) {
return http.StatusOK, ce
}
return http.StatusInternalServerError, nil
})

如何从一个仓库生成多个服务?

Section titled “如何从一个仓库生成多个服务?”

在每个服务目录中分别运行 goctl,各自使用独立的 .api.proto 文件:

Terminal window
cd services/user && goctl api go -api user.api -dir .
cd services/order && goctl api go -api order.api -dir .