Day 4 Go | 青训营笔记

72 阅读3分钟

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

Go框架三件套:

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

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

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

Gorm的使用

约定的规则(默认)

  1. 使用名为ID的字段作为主键
  2. 使用结构体的蛇形负数作为表名
  3. 字段名的蛇形作为列名 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) 终止后续调用

hertz文档文献

什么是dsn?

https:/github.com/go-sql-driver/mysql#dsn-data-source-name

(后续完善中)