Go 框架|青训营笔记

106 阅读3分钟

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

Go 框架三件套详解(Web/RPC/ORM)

Gorm基本使用

定义Gorm model

type Product struct{

Code string

Price uint

}

定义表名

func(p Product)TableName()string{

return "product"

}

dsn包括user:aaaa@aaa@aaa(1.1.1.1:8888)/

db.Create()创建

Gorm使用名为ID的字段作为主键

字段名的蛇形为列名(蛇形即加入下划线)

db.First()根据主键查找

db.Model().Updata()更新数据

db.Delete()删除数据

使用CreateAt和UpdatedAt作为创建时间和更新时间

GORM支持MySQL、SQLServer

DSN包含连接数据库的信息

使用clause.OnConflict处理数据冲突

通过使用default标间为字段定义默认值

例如

type User struct {

ID int64

Name string gorm:"defalut:galeone"

Age int64 gorm:"default:18"

}

可以通过fmt.Println(res.Error)打印并获取err

使用First查询不到数据会返回ErrRecordNotFound

使用Find查询数据查询不到不会返回错误

如果查询0值要用Map构建查询条件

使用Struct更新时只会更新0值,更新0值要用Select

db.Model(&User{ID:1111}}.Select("name").Updates(map[string]interface{}{"name":"hello","age":"18"})//更新选定字段

gorm.DeleteAt软删,数据不会从数据库删除,但数据不会被除Unscoped之外的方法查询到

db.Delete()物理删除

type User struct {

ID int64

Name string gorm:"defalut:galeone"

Age int64 gorm:"default:18"

Deleted gorm.Delete

}//这样结构体支持软删

可以用Unscoped.Find找到被软删的数据

可以用Begin、Commit、Rollback使用事务,可以用Transaction自动提交事务(推荐使用),可以用SkipDefalutTransaction关闭默认事务

GORM提供了CURD的Hook能力,hook是自动调用的

GORM代码生成工具go-gorm/gen

GORM乐观锁go-gorm/optimisticlock

GORM手动索引go-gorm/hints

GORM分片库方案go-gorm/sharding(数据量大的时候会用)

ID:1111会兜底处理,0值默认不读取,无法区分0和0值

GORM有循环ID实现,但自动生成没有

GORM联表查询需要使用多个结构体

创建数据最好不要用循环

GORM初始化全局用一次,初始化多次会出问题

Kitex代码生成工具对Windows支持不完善

使用IDL定义服务与接口

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

Kitex服务默认监听端口8888

echo.NewClient()//创建Client

XDS扩展kitex-contrib/xds

Hertz服务监听8080端口

server.default初始化端口

提供GET、POST、PUT、DELETE、ANY用于注册路由

路由优先级:静态>命名>通配

Hertz提供Bind、Validate、BindAndValidate用于参数绑定和校验

Hertz中间件分为客户端中间件和服务端中间件

Hertz提供了HTTP Client用于帮助发送HTTP请求

Hertz性能:网络库Netpoll、Json编解码Sonic、使用sync.Pool解析优化

笔记项目demoapi(API服务)demouser(用户数据管理)demonote(笔记数据管理)

阅读www.cloudwego.io新手任务cloudwego/hertz/issues

hertz quick试用阶段

标准上下文传递源信息context.context

异步调用时一个上下文会被回收,会有问题,要用两个上下文

hertz服务中会调用rpc.clint

c.string作为responce返回了

用note实现和用hertz实现网关都可以

kitex底层用的netpoll性能更好,跑分性能远超其他框架