这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
后端编写离不开框架,今天主要学习的内容是go的常用框架,go的三件套包括Gorm,Kitex,Hertz。
gorm 主要用于后端与数据库的连接及一些增删改查和事务的基础的操作
Gorm的基础使用
定义gorm model
type Product struct{
Code string
price vint
}
为model定义表名
func (p Product) TableName()string{
return "product"
}
连接数据库
func main(){
db,err := gorm.Open(
mysql.Open(dsn:),&gorm.Config{})
if err != nil{
panic(v:)
}
}
增删改查操作
使用First时,需要注意查询不到数据会返回ErrRecordNotFound,使用find查询多条数据,查询不到数据不会返回错误
使用结构体作为查询条件时,Gorm只会查询非零值字段
使用Struct更新时只会更新非零值,如需更新零值可以使用Map更新或使用Select选择字段
GORM提供了gorm.DeletedAt用于帮助用户实现软删(如需查询可使用Unscoped)
GORM事务
事务包括Begin(开始),Commit(提交),Rollback(回滚)基本方法
gorm提供了Tansaction方法用于自动提交事务
Kitex
定义IDL
namespace go api
struct Request{
1:string message
}
struct Response{
1:string message
}
service Echo{
Response echo(1:Request req)
}
kitex 生成代码
命令:kitex module example -service example echo.thrift
build。sh:构建脚本
kitex_gen:IDL 内容相关的代码生成
main.go 程序入口
handle.go 用户在该文件里实现IDL
service 定义的方法
基本使用
创建Client
c,err := echo.NewClient("example",client.WithHostPorts("0.0.0.0:8888"))
if err !=nil {
log.Fatal(err)
}
发起请求
req := &api.Request{Message:"my request"}
resp,err := c.Echo(context.Background(),req,callopt.WithRPCTimeOut(3*time.Second))
if err!=nil{
log.Fatal(err)
}
log.Println(resp)
Hertz
Hertz路由
Hertz 提供了 GET、POST、PUT、DELETE、ANY等方法用于注册路由
Hertz 提供了路由组(Group)的能力,用于支持路由分组的功能
Hertz 提供了参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由
Hertz 提供了Bind、Vaildate、BindAndValidate函数用于进行参数绑定和校验
Hertz中间件包括客户端中间件和服务端中间件
Hertz提供了Http Client用于帮助用户发送HTTP请求
Hertz代码生成工具Hz,通过定义IDL文件即可生成对应的基础服务代码
struct HelloReq{
1:string Name(api.query="name");
}
struct HelloResp{
1:string RespBody;
}
service HelloService{
HelloResp HelloMethod(1:HelloReq request)(api.get="/hello");
}