Web 系统搭建第一步,选择技术框架,完成 Hello World

小玖用的 Go 版本是 1.21.6

介绍项目的技术选型个结构,不包括代码。

一、技术框架选择

Web 框架: github.com/gin-gonic/gin v1.9.1

调研了 Go 开发者一圈,给小玖推荐这个框架的人最多 tushe

主要优点是轻量容易定制。

ORM 框架: xorm.io/xorm v1.3.6

最初小玖选的 gorm,因为网上的评价一致是:gorm 是国人开发,用户更多,文档更完善,更简单好用;xorm 的优点只是性能好点。

但是后面查问题时发现,gorm 网上相关的资料也不是那么多,所以改为了使用 xorm
(搜索 gorm 的问题,出来了很多 xorm 的相关回答)

主要是这个框架自带缓存功能,想偷懒一下~

配置文件处理工具: github.com/spf13/viper v1.18.2

这个工具可以同时处理 yamljson 和命令行参数等多种配置方式,所以选择了它。

以下这些工具包,根据网上使用人数,以及功能是否完善、丰富做的选择。

日志框架: 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 项目的启动文件,放在项目根目录,其他文件自己根据项目情况新建目录存放就可以了。

但是建议还是将源程序用一个目录统一存放,避免目录结构混乱。这个统一存放源文件的目录类似 javamian 目录。

需要注意不同的包(目录)的源程序文件不能循环引用。

小玖参考了一些其他项目的包设计,然后根据功能需要,设计的项目包目录结构如下:

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 源文件区分开了,各个功能模块的逻辑都较为清晰,小玖用的算是比较舒服,仅供参考。

在确定了包结构后,就可以根据各个模块的职责往里面添代码,从网上找找这些框架的配置教程即可。

一些比较核心的逻辑小玖会在后面的章节中继续介绍。