时间:2021-05-22
分享两个常用的代码生成工具:
基于 MySQL 数据表结构进行生成 3 个文件:
在进行业务需求开发时,创建完数据表后,执行代码生成工具,常用的 CURD 操作全部生成完毕,使用的时候只需要 . 后面的方法即可,这样大大提高了业务开发效率。
表结构:
CREATETABLE`user_demo`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键',`user_name`varchar(32)NOTNULLDEFAULT''COMMENT'用户名',`nick_name`varchar(100)NOTNULLDEFAULT''COMMENT'昵称',`mobile`varchar(20)NOTNULLDEFAULT''COMMENT'手机号',`is_deleted`tinyint(1)NOTNULLDEFAULT'-1'COMMENT'是否删除1:是-1:否',`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`updated_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户Demo表';1、在 config 中设置需要自动生成的表,参数为 cmd.genTables,如果设置为空,表示生成当前数据库中的所有的表,如果设置多张表还可以用 “,” 分割。
[cmd]genTables = 'user_demo'2、在根目录下执行脚本
./scripts/gormgen.sh执行完毕后,会在 /internal/api/repository/db_repo 中生成 user_demo_repo 目录,同时也会生成 3 个文件:
gen_model.go 内容如下:
packageuser_demo_repo import"time" //用户Demo表//go:generategormgen-structsUserDemo-input.typeUserDemostruct{Idint32//主键UserNamestring//用户名NickNamestring//昵称Mobilestring//手机号IsDeletedint32//是否删除1:是-1:否CreatedAttime.Time`gorm:"time"`//创建时间UpdatedAttime.Time`gorm:"time"`//更新时间}gen_table.md Markdown 内容如下:
gen_user_demo.go 内容如下:
funcNewModel()*UserDemo{...} funcNewQueryBuilder()*userDemoRepoQueryBuilder{...} func(t*UserDemo)Create(db*gorm.DB)(idint32,errerror){...} func(t*UserDemo)Delete(db*gorm.DB)(errerror){...} func(t*UserDemo)Updates(db*gorm.DB,mmap[string]interface{})(errerror){...} typeuserDemoRepoQueryBuilderstruct{...} func(qb*userDemoRepoQueryBuilder)buildQuery(db*gorm.DB)*gorm.DB{...} func(qb*userDemoRepoQueryBuilder)Count(db*gorm.DB)(int64,error){...} func(qb*userDemoRepoQueryBuilder)First(db*gorm.DB)(*UserDemo,error){...} func(qb*userDemoRepoQueryBuilder)QueryOne(db*gorm.DB)(*UserDemo,error){...} func(qb*userDemoRepoQueryBuilder)QueryAll(db*gorm.DB)([]*UserDemo,error){...} func(qb*userDemoRepoQueryBuilder)Limit(limitint)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)Offset(offsetint)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereId(pdb_repo.Predicate,valueint32)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderById(ascbool)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereUserName(pdb_repo.Predicate,valuestring)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderByUserName(ascbool)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereNickName(pdb_repo.Predicate,valuestring)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderByNickName(ascbool)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereMobile(pdb_repo.Predicate,valuestring)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderByMobile(ascbool)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereIsDeleted(pdb_repo.Predicate,valueint32)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderByIsDeleted(ascbool)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereCreatedAt(pdb_repo.Predicate,valuetime.Time)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderByCreatedAt(ascbool)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)WhereUpdatedAt(pdb_repo.Predicate,valuetime.Time)*userDemoRepoQueryBuilder{...} func(qb*userDemoRepoQueryBuilder)OrderByUpdatedAt(ascbool)*userDemoRepoQueryBuilder{...}这样使用生成后的方法:
//查询示例:user_demo_repo.NewQueryBuilder().WhereUserName(db_repo.EqualPredicate,"tom").OrderById(true).QueryOne(u.db.GetDbR().WithContext(ctx.RequestContext()))基于定义的 Handler 文件中 type interface 中接口方法,进行生成文件。
本次需求的研发负责人通过定义 type interface 的方式,定义出需要开发的方法,执行代码生成工具,每个方法的空实现都会生成在一个单独的文件中,开发人员只需去实现各自方法即可,便于进行分工和代码管理。
比如 test_handler 中定义的 type interface 如下:
var_Handler=(*handler)(nil) typeHandlerinterface{//i为了避免被其他包实现i()//Create创建用户Create()core.HandlerFunc//Update编辑用户Update()core.HandlerFunc//Delete删除用户Delete()core.HandlerFunc//Detail用户详情Detail()core.HandlerFunc} typehandlerstruct{logger*zap.Loggercachecache.RepouserServiceuser_service.UserService} funcNew(logger*zap.Logger,dbdb.Repo,cachecache.Repo)Handler{return&handler{logger:logger,cache:cache,userService:user_service.NewUserService(db,cache),}} func(h*handler)i(){}在根目录下执行脚本:
./scripts/handlergen.sh test_handler // test_handler 为需要生成 handler 的包名执行完毕后,会在 /internal/api/controller/test_handler 中生成 4 个文件:
func_create.go 内容如下:
type createRequest struct{} type createResponse struct{} func (h *handler) Create() core.HandlerFunc { return func(c core.Context) { }}其中 createRequest 为入参结构体,createResponse 为出参结构体。
func_update.go 内容如下:
type updateRequest struct{} type updateResponse struct{} func (h *handler) Update() core.HandlerFunc { return func(c core.Context) { }}func_detail.go 内容如下:
type detailRequest struct{} type detailResponse struct{} func (h *handler) Detail() core.HandlerFunc { return func(c core.Context) { }}func_delete.go 内容如下:
type deleteRequest struct{} type deleteResponse struct{} func (h *handler) Delete() core.HandlerFunc { return func(c core.Context) { }}以上代码都在 go-gin-api 项目中,地址:https://github.com/xinliangnote/go-gin-api
到此这篇关于Go 代码生成工具的文章就介绍到这了,更多相关Go 代码生成工具内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
GO项目目录解释src存放源代码pkg编译后生成的文件bin编译后生成的可执行文件背景在src目录下,新建文件test.go,编写代码。控制台执行gobuild
Go的随机数生成器是生成难以猜出的密码的一种很好的方法。属性提供的随机数生成器。GO编程语言生成由ASCII字符组成的难以猜测的密码。尽管本文中提供的代码很容易
linux随机密码生成工具mkpasswd详解及实例mkpasswd命令生成随机复杂密码,前提安装expect,然后执行mkpasswd命令即可生成随机的密码。
一、go代码中使用C代码go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import“C”即可在go代码中使用C函数代码示例:go代
Go命令Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们:图1.3Go命令显示详细的信息这些命令对于我们平时编写的代码非常有用,接下