Go框架三件套详解|青训营笔记

163 阅读3分钟

Go框架三件套详解|青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

1. 三件套介绍

Gorm:迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展

Kitex:字节内部Golang微服务RPC框架,具有高性能,强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展

Herzt:字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性,高性能,高扩展性特点

2. 三件套使用

具体详细操作可参考文档

2.1 Gorm的基本使用

  • Gorm使用名为ID的字段作为主键
  • 使用结构体的 蛇形负数作为表名
  • 字段名的蛇形作为列名
  • 结构体定义gorm model,提供TableName() string接口,返回表名

2.1.1 连接数据库

注意处理错误

 dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
 db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

2.1.2 创建数据

db.Create(&Product{Code: "D42",Price: 100})
products:=[]*product{{Code:"D41"},{Code:"D42"},{Code:"D43"}}
res:=db.Create(products)
  • 创建一条数据传对象
  • 创建多条数据传切片
  • 使用clause.OnConflict处理数据冲突
  • 使用default标签为字段定义默认值

2.1.3 查询数据

查询单条数据

var product Product
db.First(&product,1)//根据整型主键查找
db.First(&product,"code=?","D42")//查找code字段值为D42的记录

查询多条数据

result:=db.Where("age>10").Find(&users)
fmt.Println(result.RowsAffected)//记录数
db.Where("name IN ?",[]string{"jinzhu","jinzhu 2"}).Find(&users)
db.Where("name LIKE ?",%jin%).Find(&users)
db.Where("name = ? AND age>=?","jinzhu","22").Find(&users)
db.Where(&User{Name:"jinzhu",Age:0}).Find(&users)
db.Where(map[string]interface{}{"Name":"jinzhu","Age":0}).Find(&users)
  • 使用First时,需要注意查询不到数据会返回ErrRecordNotFound
  • 使用Find查询多条数据,查询不到数据不会返回错误
  • 使用结构体作为查询条件时,GORM只会查询非零值字段,这意味着如果字段值为0、false,该字段不会被用于构建查询条件,使用Map来构建查询条件

2.1.4 更新数据

更新时需要指定条件,当使用Model方法,且该对象主键有值,则该值会被用于构建条件如下:

db.Model(&product).Update("Price",200)//product为2.1.3查找到的记录
//更新多个字段
db.Model(&product).Updates(Product{Price:200,Code:"F42"})//仅支持更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price":200,"Code":"F42"})

反之则需指定条件

db.Model(&product{}).Where("Price = ?", 100).Update("Code", "F42")
  • 更新表达式:gorm.Expr()

2.1.5 删除数据

类似查询

db.First(&product,1)//根据整型主键查找
db.First(&product,"code=?","D42")//查找code字段值为D42的记录

2.1.6 GORM事务

Gorm提供了Begin、Commit、Rollback方法用于使用事务

2.1.7 GORM Hook

2.1.8 性能提高

performance文档:其他优化方案

2.1.9 Gorm支持数据库

MySQL、SQLServer、PostgreSQL、SQLite

GitHub - go-sql-driver/mysql:Go MySQL Driver 是 Go (golang) 数据库/sql 包的 MySQL 驱动程序

2.2 Kitex

Kitex对windows的支持不完善,如果本地开发环境是windows建议使用虚拟机或WSL2

2.2.1 安装代码生成工具

  • go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
  • go install github.com/cloudwego/thriftgo@latest

2.2.2 定义IDL

  • 使用IDL定义服务与接口

    如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样

2.2.3 Kitex生成代码

  • 注意上一步定义IDL

  • go mod edit -replace=github.com/apache/thrift=github.com/apache/thrift@v0.13.0初始化模块

  • 使用kitex-module example -service example echo.thrift命令生成代码

github.com/kitex-contr…

2.3 Hertz基本使用

www.cloudwego.io/zh/docs/her…

server.Default继承了recover中间件new没有继承