这是我参与「第五届青训营 」伴学笔记创作活动的第 4天
Go框架三件套:
Gorm是一个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。
Kitex是字节Golang微服务RPC框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。
Hertz是字节内部的HTTP框架,参其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点。
Gorm的使用
约定的规则(默认)
- 使用名为ID的字段作为主键
- 使用结构体的蛇形负数作为表名
- 字段名的蛇形作为列名
Gorm支持的数据库
MySQL、SQLServer、PostgreGSQL、SQLite
通过驱动来连接数据,如果需要连接其他数据库可以自行开发或者复用
操作数据库出现的问题,Gorm如何解决的
数据冲突:(唯一索引冲突)
使用clause.OnConflict处理数据冲突
//以不处理冲突为例,创建一条数据
p := &Product{Code: "D42", ID: 1}
db.CLauses(cLause.OnConflict{DoNothing:true}).Create(&p)
First的使用
使用First时,需要注意查询不到数据会返回ErrRecordNotFound.
使用Find查询多条数据,查询不到数据不会返回错误。
所以一般会使用find,这样查询不到数据的时候,就会返回空。
关于事务 提供了Begin、Commit、Rollback 方法用于使用事务
提供了Tansaction 方法用于自动提交事务,避免用户漏写Commit、Rollbcak.(代码来自字节内部课)
db, err := gorm. Open(mysql. Open( dsn:"username:password@tcp(locathost:9910)/database?charset=utf8" ),&gorm . Config{})
if err!=nil{
panic( V: "failed to connect database")
}
if err = db.Transaction(func(tx *gorm.DB)error {
if err = tx.Create (&User{Name: "name"}).Error; err != nil
return err
}
if err = tx.Create(&User{Name: "name1"}).Error; err != nil {
.2122
tx. RoLlback()
return err
}
return nil
}); err != nil {
return
CRUD的Hook能力
Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务。
Kitex
Kitex是字节内部的Golang微服务RPC框架,具有高性能,强可拓展的主要特点,支持多协议并且拥有丰富的额开源拓展
Hertz
Hertz是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性,高性能,高扩展性特点
基本使用
服务监听8080端口并注册一个GET方法的路由函数
func main() {
h := server.Default(server.WithHostPoerts("127.0.0.1:8080"))
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
})
h.Spin()
}
复制代码
路由组
h := server.Default(server.WithHostPorts("localhost:8080"))
v1 := h.Group("/test")
v1.GET("/get", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "get")
})
将请求参数绑定到结构体中
Hertz提供了Bind、Validate、BindAndValidate 函数用于进行参数绑定和校验
func MyMiddleware() app.HandlerFunc {
return func(ctxcontext.Context,c*app.RequestContext){
c.Next(ctx) // 中间件调用链下一个
}
}
func main(){
h:=server.Default(server.WithHostPort("localhost:8080"))
h.Use(MyMiddleware())
h.Get("/test",func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "Hello hertz!")
})
h.Spin()
}
可使用 Abort(), AbortWithMsg(msg string, statusCode int), AbortWithStatus(code int) 终止后续调用
什么是dsn?
https:/github.com/go-sql-driver/mysql#dsn-data-source-name
(后续完善中)