【Go-Zero】goctl一键代码生成常用实战命令


大家好 我是寸铁👊
总结了一篇【Go-Zero】goctl一键生成常用命令的文章✨
喜欢的小伙伴可以点点关注 💝

前言

本文主要是针对最常用的apimodelrpc代码生成进行描述
其他的代码生成命令可以根据自己的需求在官方文档进行查看

goctl介绍

背景:goctl 的最早功能是为了解决 GRPC 内网调试问题,大约是在 2019 年,在我们的生产环境中,rpc 是内网隔离的,不可通过外网访问,为了快速去 mock 一些线上 RPC client 的请求,就简单的实现了第一版本的代码生成,主要目的是去访问 RPC Server 做一些调试。

goctlgo-zero 的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s yamldockerfile 等。


goctl作用

  • 降低沟通成本

沟通,是团队协作进行信息交换的一种形式,沟通的方式有很多种,会议沟通、文档沟通、聊天交流,相信不管是哪种方式,沟通都是团队中最难的一个环节,会议沟通需要占用大量时间,动则半小时起步,文档沟通同样,也会占据大量时间去构思和编写大篇幅的文档,最后可能还没表达出预期目标,线上聊天,需要双方都在线上才能进行信息交换,当然我们这里沟通交换的信息更多是指开发中的一些内容,如接口信息、部署信息等。

  • 降低团队耦合

有了沟通,那么团队之间的协作的耦合是避免不了的,例如:在前后端开发中,最大的耦合是接口的耦合,前端完成了规定 UI 绘制后,需要等待后端的接口部署到对应环境才能实现功能的调试,在此期间,前端的团队资源就会大大浪费,由此还会导致项目的延期等问题。

  • 提高开发效率

除了沟通成本和团队耦合以外,每个团队在进行项目开发时也有很多时间是在做重复的工作,例如:我们在开发一个新的功能时,需要去定义接口,编写接口文档,编码准备工作,业务开发,model 文件,编写 Dockerfile 文件,编写 k8s yaml 文件,在这些上面我们可以在每个环节上都有提升的空间,让用户将真正的时间集中在业务开发上。

  • 降低错误率

在之前的开发实践中,经常会出现grpc server实现不完全的问题,grpc server 实现类经常会出现编译不过的情况;除此之外,数据库查询层代码开发,sql 语句的编写多参,少参,参数错位,在编译过程中很难发现,一般可能到 QA 环节才能发现,更甚者会导致线上问题。


命令介绍

goctl这么强大的代码生成工具,下面笔者带你使用起来!


api

根据 api 文件生成Go HTTP代码。

一键生成

goctl api go -api xx.api -dir.

注意:这里的xx 替换为你自己编写的api文件的名字


参数说明

再来看一下使用这个命令的参数说明

Flags:
      --api string      The api file
      --branch string   The branch of the remote repo, it does work with --remote
      --dir string      The target dir
  -h, --help            help for go
      --home string     The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
      --remote string   The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
                        The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
      --style string    The file naming format, see [https://github.com/zeromicro/go-zero/blob/master/tools/goctl/config/readme.md] (default "gozero")

详细说明

参数含义必填
apiapi 文件路径
branch远程模板所在 git 分支名称,仅当 remote 有值时使用
dir代码输出目录
home本地模板文件目录
remote远程模板所在 git 仓库地址,当此字段传值时,优先级高于 home 字段值
style输出文件和目录的命名风格格式化符号

最常用参数
  • api 常用于指定文件路径
    一般是直接在当前的api 目录下,使用命令,所以这里的文件路径通常是文件的名字即可,如-api xx.api , -api 后面跟着的就是文件路径

  • style 常用于生成logic 文件的命名
    --style = goZero 就会生成如userLogic 这种驼峰式命名的文件

  • dir 常用于指定代码输出的目录,一般是直接-dir.,指定当前目录


生成结果

生成的文件夹结构如下:

在这里插入图片描述


model

官方声明model命令支持3种数据库,分别是MongoMySQLPostgreSQL。笔者这里主要是使用MySQL数据库进行操作。


运行 goctl model mysql --help,查看mysqlmodel指令怎么使用?

Available Commands:
  datasource  Generate model from datasource
  //从数据库连接生成代码
  ddl         Generate mysql model from ddl
  //从ddl(sql文件)生成代码
Flags:
  -h, --help                     help for mysql
  -i, --ignore-columns strings   Ignore columns while creating or updating rows (default [create_at,created_at,create_time,update_at,updated_at,update_time])
      --strict                   Generate model in strict mode

说明:goctl model mysql 指令用于生成基于 MySQL 的 model 代码,支持生成带缓存不带缓存的代码。
MySQL 代码生成支持从 sql 文件数据库连接两个来源生成代码。

这里的带缓存只需要在命令末尾添加--cahe = true即可实现,非常方便,其底层是基于redis 实现的。

一键生成

笔者这里演示从ddl生成代码
goctl model mysql ddl 指令用于从 sql 文件生成 model 代码。


命令如下:

goctl model mysql ddl --src user.sql --dir .

参数说明

再来看一下使用这个命令的参数说明

Flags:
      --branch string     The branch of the remote repo, it does work with --remote
  -c, --cache             Generate code with cache [optional]
      --database string
  -d, --dir string        The target dir
  -h, --help              help for ddl
      --home string       The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
      --idea              For idea plugin [optional]
      --remote string     The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
                          The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
  -s, --src string        The path or path globbing patterns of the ddl
      --style string      The file naming format, see [https://github.com/zeromicro/go-zero/blob/master/tools/goctl/config/readme.md]


详细说明
参数含义必填
branch远程模板所在 git 分支名称,仅当 remote 有值时使用
cache是否生成带缓存的代码,默认为false
dir代码输出目录
home本地模板文件目录
remote远程模板所在 git 仓库地址,当此字段传值时,优先级高于 home 字段值
srcsql 文件路径
style输出文件和目录的命名风格格式化符号
ignore-columns需要忽略的字段,插入或者更新时需要忽略的字段
strict是否是严格模式,如果是严格模式下,会对 unsigned 修饰的字段转换为对应的数据类型,主要针对数值型,例如:如果数据库中列为 bigint 类型,如果为unsigned 修饰则对应的 golang 数据类型就为 int64,否则为 uint64,如果 strict 为 false,则不关注unsigned修饰

strict机制的引入是针对MySQLgolang数据类型映射的转换关系处理

最常用参数
  • src 常用于指定sql文件路径
    一般是直接在当前的model 目录下,使用命令,所以这里的文件路径通常是文件的名字即可,如--src xx.sql , --src 后面跟着的就是sql文件的路径

  • style 常用于生成logic 文件的命名
    --style = goZero 就会生成如userLogic 这种驼峰式命名的文件

  • dir 常用于指定代码输出的目录,一般是直接-dir.,指定当前目录


生成结果

在这里插入图片描述


rpc

根据 protobufer 文件生成 rpc 服务

生成单个rpc服务

goctl rpc protoc xx.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=. 

生成多个rpc服务(服务分组)

goctl rpc protoc xx.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=. -m

注意:

  • 上述命令的xx 替换为你具体写的proto 文件
  • pb 替换为你想把生成的代码存放的文件夹名字

参数说明

再来看一下使用这个命令的参数说明

Flags:
      --branch string     The branch of the remote repo, it does work with --remote
  -c, --client            Whether to generate rpc client (default true)
  -h, --help              help for protoc
      --home string       The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
  -m, --multiple          Generated in multiple rpc service mode
      --remote string     The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
                          The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
      --style string      The file naming format, see [https://github.com/zeromicro/go-zero/blob/master/tools/goctl/config/readme.md]
  -v, --verbose           Enable log output
      --zrpc_out string   The zrpc output directory

详细说明
参数含义必填
branch模板仓库分支,配合 --remote 使用
home模板仓库本地路径,优先级高于 --remote
multiple是否生成多个 rpc 服务
remote模板仓库远程路径
style文件命名风格,详情可参考 文件风格
zrpc_out输出目录

最常用参数
  • multiple 常用于启动多个rpc 服务

  • style 常用于生成logic 文件的命名
    --style = goZero 就会生成如userLogic 这种驼峰式命名的文件

  • zrpc_out 常用于指定输出的目录,一般是直接zerp_out = . 指定当前目录


生成结果

一键生成的文件夹结构如下图:

在这里插入图片描述


功能全览

官方文档

在这里插入图片描述


结语

本文主要是针对最常用的apimodelrpc代码生成进行描述。
实际上,goctl生成工具功能很强大,更多的代码生成命令可以根据自己的需求在官方文档进行查看


看到这里的小伙伴,恭喜你又掌握了一个技能👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕


往期好文💕

保姆级教程

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero

【Go-Zero】手把手带你在goland中创建api文件并设置高亮


报错解决

【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案

【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案

【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案

【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案

【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案


Go面试向

【Go面试向】defer与time.sleep初探

【Go面试向】defer与return的执行顺序初探

【Go面试向】Go程序的执行顺序

【Go面试向】rune和byte类型的认识与使用

【Go面试向】实现map稳定的有序遍历的方式

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐