本项目主要提供一个基于 go-zero 的基本开发模板,然后快速开发,有两种思路
go install github.com/zeromicro/go-zero/tools/goctl@latest
goctl env check --install --verbose --force
goctl api new project
cd project
go mod tidy
go run ./
即可获取一个最基础的项目,然后从本项目中获取你需要的相关包
git clone https://github.com/xemxx/go-zero-template.git
cd go-zero-template
rm -rf .git
git init
go mod tidy
这就完成了项目初始化,再根据需要,重新编写api文件,根据上面的教程步骤实现开发,最好将 go.mod 文件的包名改为自己的项目地址
本项目基础采用 go-zero 进行开发,其他组件按需引用,主要利用到了api生成功能和db结构生成功能
- /api
- 存放实际api定义文件,根据go-zero 的现状,需要把所有api定义写在同一个文件
- /model
- 存放数据库模型,主要是根据 go-zero 生成数据库表的定义,快速开发
- /internal
- 存放内部库,按照一般的规则,整个项目是有可能被引用的,但是internal目录下的包是不能被其他项目引用的
- 内部的目录结构由 go-zero 自动生成,暂时不变更,没有出现太大的逻辑问题
- 特别说明
- /handler 这个目录主要是包装入参和错误码,自动生成,不需要关注
- /logic 这个目录主要是实现代码逻辑,是主要编写代码的地方,在go里面一般是数据库逻辑和业务逻辑不会有太明显的分层,如果出现逻辑复杂通常在同一个文件里写多个函数,来实现控制函数复杂度
- /types 这个目录比较特殊,按理说每个接口的定义会区分文件,这里生成的就不管了
- /config 这个目录的配置文件是有默认值
- /db
- 存放我们的数据库表定义
- /pkg
- 通常存放公共组件,可以复用的
- /mysql
- mysql链接池,目前非常简陋
- /etc
- 这个表存放了配置文件的示例
这个项目基础主要用于api项目,所以主要如下
1、定义api
根据语法 https://go-zero.dev/docs/tasks/dsl/api 在/api 文件夹下的文件中编写你的api接口
然后通过命令
goctl api go --api ./api/foo.api --dir .
生成自动化的代码,通常执行路径我们的项目根目录,其他自行替换路径
2、生成需要的db结构
根据实际情况,如果已经编写在db,最好是直连db生成,命令如下:
goctl model mysql datasource --url "root:123456@tcp(127.0.0.1:13306)/markman" -t user -t note -d internal/model
说明:
- url 是可以替换成实际的dsn链接
- -t 参数表示你需要的数据表,可以多个
- -d 代表了生成文件的输出目录
go里面通常会平铺代码,然后用不同的文件名称来代表模块,所以这个model生成的代码我们通常放置于一起
其他除非你手写sql文件,则可以利用文件生成
goctl model mysql ddl --src db/user.sql --dir internal/model
3、保存数据库sql
方便的话,将数据库的建表 sql 作为版本文件存放于 db 目录中,这样方便沟通是否修改
按理说存在一个db迁移工具,方便做版本切换,但是实际生产中的db修改都是很少的,通常会单独编写一个升级脚本,所以暂时不做太过于集成化的东西。
4、修改启动配置
如果我们需要新增配置,比如指定什么什么文件,端口什么的,可以修改 config 目录下的配置结构体,然后修改 etc 目录下的示例文件
通常开发配置可以在本地新建一个配置,比如在新增一个配置文件是 etc/foo.yaml.dev
然后启动项目就可以是
go run ./foo.go -f etc/foo.yaml.dev
这样就可以使用我们本地的配置
5、错误返回
参考 https://go-zero.dev/docs/tutorials/http/server/response/ext
引入一个新的errors包,然后在types目录中添加我们的Errors定义文件,每次直接引入即可
6、逻辑编写
通常在生成api和db之后就能编写逻辑了,db操作参考 https://go-zero.dev/docs/tutorials/mysql/curd
整个流程可以参考 internal/logic/g1/loginlogic.go 的 Login 方法以及 internal/handler/g1/loginhandler.go