这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
第二天和第三天的笔记合一起写。
第二天主要讲了Go 语言进阶与依赖管理。
在并发方面,Go 语言主要通过较好地支持协程提高并发效率,在 goroutinue 的管理上使用了 GMP 的思想(面试重点),将对底层 CPU 资源的调度对用户屏蔽,高效易用。
Go 语言提倡通过通信共享内存,而不通过共享内存通信,实际表现为推荐不同 goroutinue 之间使用 channel 进行通信的效率比使用互斥锁保护一块内存进行共享的方法效率更高。
之后讲到了 Go 语言的依赖管理,其中举了例子指出 go mod 在版本选择上会选择所有依赖中要求的最高版本,不会对各个子部分提供不同版本的依赖控制:
- gopath
- 无法实现 package 多版本控制
- vendor
- 无法控制依赖的版本
- 更新项目还是可能出现依赖冲突
- go mod
- 通过配置文件描述依赖 go.mod
- 中心仓库管理依赖 Proxy
- 本地工具 go get/mod
第三天讲了字节内部常用的几个框架,分别对应项目中的数据库部分、前端请求处理和微服务组件间的 RPC 通信。
主要对 Gorm 部分印象较深(比较听得懂)
使用时定义 model 对应一个表名,可以使用 gorm tag 来对应特定的列名;使用 dsn 连接数据库;使用 First 查询不到数据会返回一个 err,使用 Find 查询数据查不到不会返回错误(所以一般用find);使用Struct 更新时,只会更新非零值,如果需要更新零值可以使用Map 更新或使用Select选择字段。
sql 表达式更新?
GORM提供了gorm.DeletedAt 用于帮助用户实现软删;有软删除能力的Model 调用Delete时,记录不会被从数据库中真正删除。但 GORM会将DeletedAt置为当前时间,并且你不能再通过正常的查询方法找到该记录;使用Unscoped可以查询到被软删的数据。
Gorm提供了Begin、Commit、Rollback方法用于使用事务
GORM在提供了 CURD的Hook 能力。Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。 如果任何Hook返回错误,GORM将停止后续的操作并回滚事务。
使用 PrepareStmt缓存预编译语句可以提高后续调用的速度,本机测试提高大约35 %左右thy 7992。