现如今,Go 语言越来越多地被用于后端服务开发中。但与已经十分成熟的 Java 相比较,Go 目前仍缺乏一个全面的服务应用开发框架,在进行开发时往往仍需要大量造轮子。GoFrame,其目的是为 Go 语言提供一个企业级的基础开发框架,提高开发效率和可靠性。
简介
GoFrame,是 johng 在 Gitee 上开源的 Go 基础开发框架,仓库位于 https://gitee.com/johng/gf,目前版本为 v2.0.6。
GoFrame 是一款模块化、高性能、企业级的 Go 基础开发框架。GoFrame 不是一款 WEB/RPC 框架,而是一款通用性的基础开发框架,是 Go 标准库的一个增强扩展级,包含通用核心的基础开发组件,优点是实战化、模块化、文档全面、模块丰富、易用性高、通用性强、面向团队。
使用
GoFrame 具有以下特点:
- 业内领先、工程完备
- 模块化、松耦合设计
- 组件丰富、开箱即用
- 简洁易用、文档详尽
- 接口化、高扩展性设计
- 全链路跟踪特性
- 全错误堆栈特性
- 接口化的错误码支持
- 稳健的工程设计规范
- 更便捷强大的ORM组件
- 便捷的开发工具、自动化代码生成
- 支持OpenTelemetry可观测性标准
- 自动化的接口文档生成,支持OpenAPIV3标准
- 完善的本地中文化支持
- 设计为团队及企业使用
在项目中使用 GoFrame,使用 go get 直接安装,要求 Go >= 1.15:
go get -u -v github.com/gogf/gf/v2
推荐使用 go.mod:
require github.com/gogf/gf/v2 latest
GoFrame 架构如下:
GoFrame 使用 CLI 工具来构建服务,首先安装 GoFrame CLI 工具:
go install github.com/gogf/gf/cmd/gf/v2
然后使用 init 命令创建一个指定名称的项目:
$ gf init hello
输出:
initializing...
initialization done!
you can now run 'cd hello && gf run main.go' to start your journey, enjoy!
我们就能得到一个基本的 Go 服务项目。可以构建一个最简单的 API 服务:
package v1
import (
"github.com/gogf/gf-demo-user/v2/internal/model/entity"
"github.com/gogf/gf/v2/frame/g"
)
type UserProfileReq struct {
g.Meta `path:"/user/profile" method:"get" tags:"UserService" summary:"Get the profile of current user"`
}
type UserProfileRes struct {
*entity.User
}
type UserSignUpReq struct {
g.Meta `path:"/user/sign-up" method:"post" tags:"UserService" summary:"Sign up a new user account"`
Passport string `v:"required|length:6,16"`
Password string `v:"required|length:6,16"`
Password2 string `v:"required|length:6,16|same:Password"`
Nickname string
}
type UserSignUpRes struct{}
type UserSignInReq struct {
g.Meta `path:"/user/sign-in" method:"post" tags:"UserService" summary:"Sign in with exist account"`
Passport string `v:"required"`
Password string `v:"required"`
}
type UserSignInRes struct{}
type UserCheckPassportReq struct {
g.Meta `path:"/user/check-passport" method:"post" tags:"UserService" summary:"Check passport available"`
Passport string `v:"required"`
}
type UserCheckPassportRes struct{}
type UserCheckNickNameReq struct {
g.Meta `path:"/user/check-passport" method:"post" tags:"UserService" summary:"Check nickname available"`
Nickname string `v:"required"`
}
type UserCheckNickNameRes struct{}
type UserIsSignedInReq struct {
g.Meta `path:"/user/is-signed-in" method:"post" tags:"UserService" summary:"Check current user is already signed-in"`
}
type UserIsSignedInRes struct {
OK bool `dc:"True if current user is signed in; or else false"`
}
type UserSignOutReq struct {
g.Meta `path:"/user/sign-out" method:"post" tags:"UserService" summary:"Sign out current user"`
}
type UserSignOutRes struct{}
除了用于构建服务,GoFrame 还提供了大量用于库开发的模块,包括:
- 数据结构:字典类型、数组类型、集合类型等
- 系统相关:定时器、内存锁、定时任务、缓存管理等
- 文本处理:字符串处理、正则表达式
- 编码解码:二进制、HTML、XML、YAML 等
- 数据管理:数据库 ORM、Redis 客户端
- 加密解密:MD5、AES、DES 等
- 实用工具:随机数、唯一数、类型转换、数据校验等
- 单元测试:单元测试
- 错误管理:错误处理、错误码接口
- 功能调试
- I18N组件
如定时任务 gcron:
import "github.com/gogf/gf/v2/os/gcron"
gcron.AddSingleton(ctx, "* * * * * *", func(ctx context.Context) {
glog.Print(context.TODO(), "doing")
time.Sleep(2 * time.Second)
})
select {}
数据库 ORM:
db, err := gdb.New(gdb.ConfigNode{
Link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test",
})
总结
GoFrame 是一款模块化、高性能、企业级的 Go 基础开发框架,是 Go 标准库的一个增强扩展级,包含通用核心的基础开发组件,优点是实战化、模块化、文档全面、模块丰富、易用性高、通用性强、面向团队,不妨考虑应用到实践中。