写点什么

【电商实战 02】如何借助工具快速生成代码?初学者容易踩的坑有哪些?

作者:王中阳Go
  • 2022-11-14
    北京
  • 本文字数:3461 字

    阅读完需:约 11 分钟

【电商实战02】如何借助工具快速生成代码?初学者容易踩的坑有哪些?

上期回顾

上一篇内容分享了【电商实战01】如何快速编写api层和model层?


这篇内容继续分享重点内容:如何借助工具快速生成代码?初学者容易踩的坑有哪些?


如果你第一次看我【电商实战】系列的文章,建议先看【电商实战】先看这里:适合人群&课程大纲&开源地址&视频合集&一起学习


看过的朋友请忽略,继续往下看

本期重点

使用 gen service 自动生成代码

注意:该功能特性从 goframe v2.1 版本开始提供。

基本介绍

设计背景

在业务项目实践中,业务逻辑封装往往是最复杂的部分,同时,业务模块之间的依赖十分复杂、边界模糊,无法采用 Golang 包管理的形式。


如何有效管理项目中的业务逻辑封装部分呢?对于每个采用 Golang 开发的项目都是必定会遇到的难题。

设计目标

增加 logic 分类目录,将所有业务逻辑代码迁移到 logic 分类目录下,采用包管理形式来管理业务模块。


业务模块之间的依赖通过接口化解耦,将原有的 service 分类调整为接口目录。这样每个业务模块将会各自维护、更加灵活。


可以按照一定的项目规范,从 logic 业务逻辑代码生成 service 接口定义代码。


同时,也允许人工维护这部分 service 接口。

命令使用

gf gen service命令通过分析给定的 logic 业务逻辑模块目录下的代码,自动生成 service 目录接口代码。


需要注意:

  1. 由于该命令是根据业务模块生成 service 接口,因此只会解析二级目录下的 go 代码文件,并不会无限递归分析代码文件。以 logic 目录为例,该命令只会解析 logic/xxx/*.go 文件。因此,需要 logic 层代码结构满足一定规范。

  2. 不同业务模块中定义的结构体名称在生成的 service 接口名称时可能会重复覆盖,因此需要在设计业务模块时保证名称不能冲突。手动模式

手动执行(不建议)

如果是手动执行命令行,直接在项目根目录下执行 gf gen service 即可。


$ gf gen service -hUSAGE    gf gen service [OPTION]
OPTION -s, --srcFolder source folder path to be parsed. default: internal/logic -d, --dstFolder destination folder path storing automatically generated go files. default: internal/service -f, --dstFileNameCase destination file name storing automatically generated go files, cases are as follows: | Case | Example | |---------------- |--------------------| | Lower | anykindofstring | | Camel | AnyKindOfString | | CamelLower | anyKindOfString | | Snake | any_kind_of_string | default | SnakeScreaming | ANY_KIND_OF_STRING | | SnakeFirstUpper | rgb_code_md5 | | Kebab | any-kind-of-string | | KebabScreaming | ANY-KIND-OF-STRING | -w, --watchFile used in file watcher, it re-generates all service go files only if given file is under srcFolder -a, --stPattern regular expression matching struct name for generating service. default: ^s([A-Z]\\w+)$ -p, --packages produce go files only for given source packages -i, --importPrefix custom import prefix to calculate import path for generated importing go file of logic -l, --clear delete all generated go files that are not used any further -h, --help more information about this command
EXAMPLE gf gen service gf gen service -f Snake
复制代码


参数说明:


自动模式(强烈建议)

如果你是使用的 GolandIDE,那么可以使用官方提供的配置文件:watchers.xml 自动监听代码文件修改时自动生成接口文件。使用方式,如下图:


自动模式配置教程

1. 引入官方提供的配置文件

建议在使用 Goland IDE 时,使用官方提供的配置文件:watchers.xml


watchers.xml 下载地址:https://goframe.org/pages/viewpage.action?pageId=49770772&preview=/49770772/49770777/watchers.xml

2. 编写业务逻辑代码

3. 生成接口及服务注册文件

如果你已经按照步骤 1 做好了watchers.xml的配置,那么这一步可以忽略。因为在我们编写代码的时候,service 便同时生成了接口定义文件。


如果没有配置,我们每次编写 logic 业务模块后,都需要手动执行一下 gf gen service 命令。


所以,我强烈建议你按照教程配置watchers.xml


不管用哪种方式,生成的 service 目录,效果如下:



注意:下面就是我说的初学者容易踩的坑

4. 注意服务的实现注入部分(仅一次)

只有在生成接口文件后,才能在每个业务模块中加上接口的具体实现注入。该方法每个业务模块加一次就可以。


比如这种:


5. 在启动文件中引用接口实现注册(仅一次)

注意:gf gen service命令除了生成接口文件之外,还生成了一个接口实现注册文件。


这个文件用于程序启动时,将接口的具体实现执行注册。



该文件的引入需要在 main 包的最顶部引入,需要注意 import 的顺序,放到最顶部,后面加一个空行。如果同时存在 packed 包的引入,那么放到 packed 包后面。像这样:


6. 搞定

完成上面的 5 步操作,我们就搞定了最复杂的通过编写 logic 层业务逻辑,自动生成 service 层代码的部分

跑通业务功能

上面介绍了 gf gen service 的使用,是本期的重点。


另外一个重点就是,我们本期的视频内容带大家跑通了一个业务功能:完成了管理后台轮播图的接口,欢迎大家收藏文章,找个时间动手实践视频内容:


这是【电商实战】系列的资料汇总,我单独整理成了文章,不占用每期内容的篇幅。


用敏捷开发的思想,带你快速上手实战项目

适合人群:

有一定 Go 基础,想快速上手商业实战项目的伙伴

本期解决的重点问题:

  1. 教你学会如何看文档

  2. 教你学会如何“抄作业”,也就是官方示例,或者其他优秀项目的源码

  3. 教你学会如何用敏捷开发的思路,聚焦实现阶段性的目标

开源地址

  • 这是基于 goframe1.16 版本已经开发完毕的,完全开源的电商实战项目:https://github.com/wangzhongyang007/goframe-shop

  • 为了避免混乱,最新的电商系统 v2 版本开启了新的仓库:https://github.com/wangzhongyang007/goframe-shop-v2


我也会带着大家基于 Go 的最新版本去开发实践电商实战项目,让大家少踩坑,高效学。

视频地址

经过充分考虑和小伙伴们的建议,我决定每期内容都更新文章+视频。


文章的重点是介绍本期会用到的硬核知识点。


视频的作用是带着大家一起,一步一步的去实现商业项目的需求,这样对初学者才友好。


这是本期内容在 B 站的视频地址:https://www.bilibili.com/video/BV1bt4y1K7Lj/

开发流程

我梳理了 GoFrame V2 最新版的开发流程:


  1. 设计表结构,初始化项目,修改配置文件

  2. 使用 gf gen dao 生成对应的 dao/do/model

  3. 编写 api 层:定义业务侧数据结构,提供对外接口的输入/输出数据结构

  4. 编写 model 层:定义数据侧数据结构,提供对内的数据处理的输入/输出数据结构

  5. 编写 logic 层,自动生成 service 层代码。(通过配置 goland File Watcher 自动生成,也可以通过 gf gen service 手动执行脚本生成,建议前者)

  6. 在 service 层代码生成 RegisterXX()方法后,在对应的 logic 模块注册服务(每个模块只需要写一次)

  7. 编写 controller 层,接收/解析用户输入的参数,调用 service 层的服务。

  8. 注册路由,对外暴露接口,比如这个项目是编写 cmd.go 文件。

  9. 在 main.go 中 加入一行 _ "project-name/internal/logic" (只需写一次)

  10. 在 main.go 中加入一行 _ "github.com/gogf/gf/contrib/drivers/mysql/v2" (如果你使用的是 mysql;只需写一次)


其中 9、10 只需要添加一次;步骤 6 每个模块只需要写一次

相关资料

这是我在开发过程中对我帮助很大的资料,相信对你也会有所帮助:


  • GoFrame V2 真香,我是 Get 到了高内聚低耦合的点,你呢?https://juejin.cn/post/7156119733312438279

  • 官方文档:https://goframe.org/pages/viewpage.action?pageId=57183756

  • 快速开始:https://goframe.org/pages/viewpage.action?pageId=1114399

  • 官方简单示例:https://github.com/gogf/gf-demo-user

  • 官方完整示例:https://github.com/gogf/focus-single


坚持原创输出不易,你的三连是对我最大的支持,感谢评论、点赞、转发!

一起学习

欢迎和我们一起学 Go,坚持打卡,互相监督。

可以在 InfoQ 评论区留言给我。或者通过下面「作者栏」的信息联系我,一起学习。

发布于: 22 小时前阅读数: 39
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

公众号:程序员升级打怪之旅👍微信:wangzhongyang1993👍InfoQ优质创作者👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论 (1 条评论)

发布
用户头像
在业务项目实践中,业务逻辑封装往往是最复杂的部分,同时,业务模块之间的依赖十分复杂、边界模糊,无法采用Golang包管理的形式。如何有效管理项目中的业务逻辑封装部分呢?
22 小时前 · 北京
回复
没有更多了
【电商实战02】如何借助工具快速生成代码?初学者容易踩的坑有哪些?_golang_王中阳Go_InfoQ写作社区