Web 系统搭建第一步,选择技术框架,完成 Hello World
。
小玖用的 Go 版本是 1.21.6
介绍项目的技术选型个结构,不包括代码。
一、技术框架选择
Web 框架: github.com/gin-gonic/gin v1.9.1
调研了 Go 开发者一圈,给小玖推荐这个框架的人最多
主要优点是轻量容易定制。
ORM 框架: xorm.io/xorm v1.3.6
最初小玖选的 gorm
,因为网上的评价一致是:gorm 是国人开发,用户更多,文档更完善,更简单好用;xorm 的优点只是性能好点。
但是后面查问题时发现,
gorm
网上相关的资料也不是那么多,所以改为了使用xorm
。
(搜索 gorm 的问题,出来了很多 xorm 的相关回答)
主要是这个框架自带缓存功能,想偷懒一下~
配置文件处理工具: github.com/spf13/viper v1.18.2
这个工具可以同时处理 yaml
、json
和命令行参数等多种配置方式,所以选择了它。
以下这些工具包,根据网上使用人数,以及功能是否完善、丰富做的选择。
日志框架: go.uber.org/zap v1.26.0
BCrypt 生成工具: golang.org/x/crypto v0.18.0
JWT 工具: github.com/dgrijalva/jwt-go v3.2.0+incompatible
Redis 连接工具: github.com/go-redis/redis/v8 v8.11.5
MySQL 连接工具: github.com/go-sql-driver/mysql v1.7.0
UUID 生成工具: github.com/google/uuid v1.4.0
验证码生成工具: github.com/mojocn/base64Captcha v1.3.6
内存缓存工具: github.com/patrickmn/go-cache v2.1.0+incompatible
在项目新建完成后,目录下会生成一个 go.mod
文件,用于管理依赖包,在该文件中输入以下内容:
module aurora
go 1.21.6
require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-gonic/gin v1.9.1
github.com/go-redis/redis/v8 v8.11.5
github.com/go-sql-driver/mysql v1.7.0
github.com/google/uuid v1.4.0
github.com/mojocn/base64Captcha v1.3.6
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/spf13/viper v1.18.2
go.uber.org/zap v1.26.0
golang.org/x/crypto v0.18.0
xorm.io/xorm v1.3.6
)
二、项目包结构设计
一般而言 main.go
文件是 Go 项目的启动文件,放在项目根目录,其他文件自己根据项目情况新建目录存放就可以了。
但是建议还是将源程序用一个目录统一存放,避免目录结构混乱。这个统一存放源文件的目录类似 java
的 mian
目录。
需要注意不同的包(目录)的源程序文件不能循环引用。
小玖参考了一些其他项目的包设计,然后根据功能需要,设计的项目包目录结构如下:
internal:项目源码根目录
|- application:业务逻辑相关的程序包
|--- model:模型层源文件包目录,包含了模型结构体
|--- param:web接口出入参的结构体源文件包目录
|--- router:web路由接口文件包目录(可以理解为controller),里面根据业务功能划分子包
|--- service:服务层源文件包目录,里面根据业务功能划分子包
|- config:配置文件相关
|- global:这个包用于存放一些公共逻辑和变量
|- initialize:项目初始化各种框架的包,比如xorm、redis、gin
|--- middleware:gin中间件的包
|- utils:放工具方法的包
resource:存放静态文件,比如vue管理后台源码
test:测试程序文件所在的包
application.yaml:程序的配置文件
go.mod:依赖管理文件
main.go:程序入口
这样在目录结构上将静态文件和 Go 源文件区分开了,各个功能模块的逻辑都较为清晰,小玖用的算是比较舒服,仅供参考。
在确定了包结构后,就可以根据各个模块的职责往里面添代码,从网上找找这些框架的配置教程即可。
一些比较核心的逻辑小玖会在后面的章节中继续介绍。