go-zero的一些笔记

988 阅读2分钟

关于api文件

在go-zero中,开放一个http接口,需要优先编写api文件,定义接口的请求和响应参数格式,还有一些其他信息。 参考官方文档:go-zero.dev/docs/tasks/…

不过有一些地方,在这里单独列出来,用go-zero框架,大概率都会碰到

  • 非必填参数。go-zero中,默认的请求参数字段,都是必填的。 加上optional,就会变成非必填的参数
    •  LoginReq {
           Username  string `json:"username"`
           Password  string `json:"password"`
           Verify    string `json:"verify,optional"`
           CaptchaId string `json:"captchaId,optional"`
        }
      
  • 从url中获取参数。json tag,不能写json了,要写form。
    •   InfoReq {
            Id  int64 `form:"id"`
            name string `form:"name"`
        }
      
  • ["12","13] 这样的请求参数,如何定义
    •  api 文件需要如下定义:
       post /api/xxx  deleteMany([]string) returns(DeleteResp)
      
    • 在handler中,需要直接解析req.Body

       func DeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {  
           return func(w http.ResponseWriter, r *http.Request) {  
                  var req []string  
                  decoder := json.NewDecoder(r.Body)  
                  if err := decoder.Decode(&req); err != nil {
                          result.ParamErrorResult(r, w, err)
                          return
                  }
                  if len(req) < 1 {
                          err := xerr.NewErrCode(xerr.REUQEST_PARAM_ERROR)
                          result.ParamErrorResult(r, w, err)
                          return
                  }
                  l := apiaccess.NewDeleteLogic(r.Context(), svcCtx)
                  resp, err := l.Delete(req)
                  result.HttpResult(r, w, resp, err)
              }
          }
      
  • {"version":{"1.0":"本版一","2.0":"版本二"}} 这样的返回数据如何定义类型。使用map[string]string
    •   AppManagerIndexResp{
            Priv  AppManagerIndexPriv `json:"priv"`
            Version map[string]string `json:"version"`
        }
      
  • 多个api文件如何组织。建议把同一个group的类型定义和service定义,都放在同一个文件。公共的类型,抽离到公共的api文件中。然后,用一个api文档引入各个api文件。
    • 对外的api文件内容:
      syntax = "v1"
      
       info (
           title:   "appserver服务"
           desc:    "appserver服务"
           author:  "Linden"
           email:   "linden@xxx.com"
           version: "v1"
       )
      
       import (
           //这个common.api就只能在这个导入,不然有多个文件的时候,他们都import common文件就会报错
           "./api/common.api"
           "./api/customer.api"
           "./api/apiaccess.api"
           "./api/spmanager.api"
           "./api/appmanager.api"
           "./api/useragreement.api"
       )
      
       // goctl api go -api appserver.api -dir ../  --style=goZero
      
      

关于goctl生成代码

  • 如果不太喜欢默认的格式,文件风格 | go-zero Documentation,需要加上 --style参数
    # 生成 lower case 文件和目录示例
    $ goctl api new demo --style gozero      默认的样式,个人觉得这个格式会导致阅读困难
    # 生成 snake case 文件和目录示例
    $ goctl api new demo --style go_zero   
    # 生成 camel case 文件和目录示例
    $ goctl api new demo --style goZero
    

关于rpc的配置文件

  • 当rpc里也需要配置redis的时候,要调整一下redis的配置名称。不能用Redis
    package config
    
    import "github.com/zeromicro/go-zero/zrpc"
    
    type Config struct {
    zrpc.RpcServerConf   //这结构体中已经有Redis了。
    
    Mysql struct {
    	DataSource string
    }
    
    // 这里不能用Redis,因为zrpc.RpcServerConf中已经有了Redis了
    RedisConf struct {
    	Host string
    	Type string
    	Pass string
    	Tls  bool
    }
    }
    

关于live reload

由于Go是不支持热编译特性的,每一次代码变更后都要重新手动停止、编译、运行代码文件。非常麻烦。。。
这里就要用到air 这个提高开发效率的工具了。cosmtrek/air: ☁️ Live reload for Go apps (github.com)
基本做到了,前端开发自动编译的效果。

关于json转struct/proto工具

可以小小地提高一下效率。
在线json转struct_go在线工具集 (gotool.top)
在线json转protobuf_go在线工具集 (gotool.top)