字节青训营笔记(第一周)
Go 语言基础
待补充
GO 依赖管理方案演变
GOPATH
-
无法实现多版本控制
-
GO 项目工作区
- bin
- pkg
- src
Go Vendor
- 项目下增加vendor 文件,依赖寻址方式: vendor => GOPATH
Go Module
-
通过go.mod 文件管理依赖包版本
-
通过go get/go mod 指令工具管理依赖包
-
目标是定义版本规则和管理项目依赖关系
-
依赖管理三要素
- go.mod 配置文件,描述依赖
- Proxy 中心仓库管理依赖库
- go get/mod 本地工具
-
go mod 命令
- init 初始化
- download 下载模块到本地缓存
- tidy 增加需要的依赖,删除不需要的依赖
测试
单元测试
- 所有测试文件以_test.go结尾
- 单元测试函数必须以Test开头
func TestXxx(*testing.T)
复制代码
- 初始化逻辑放到TestMain中用下面代码来运行全部测试用例
func TestMain(m *testing.m) {
//xxx
code := m.Run()
//xxx
os.Exit(code)
}
复制代码
测试文件使用 go test [flags][packages]来运行
go test main_test #run测试用例
go test main_test.go main.go --cover #测试同时输出覆盖率
复制代码
tips
- 一般覆盖率:50%-60%,较高覆盖率80%
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
Mock测试
幂等和稳定性 patch 和 unpatch (待补充)
基准测试
待补充
三件套
这段太难了,后面再补充
Gorm
- 基础使用
- 定义结构体(gorm module)
- 为model定义表名(TableName函数返回表名)
- db = gorm.Open(mysql.Open(""), &gorm.Config{}) //连接数据库
- db.Create(&Product{Code:"D42", Price:100}) //创建数据
- db.First(&product, 查询条件) //查询
- db.Model(&product).Update("price", 200) //更新某个字段
- dp.Model(&product).Update(Product{Code:"D42", Price:100})// 更新非0值
- db.Model.delete
- 默认使用ID作为主键
- 支持的数据库
- MySQL, SQLServer, PostgreSQL,SQLite
- 使用不同的DSN来创建连接
- 如果需要连接其他类型数据库可以重写驱动的接口
- 删除数据
- 物理删除
db.Delete(&user-}db.Delete(&User(}conds...:"10") // DELETE FROM users WHERE id = 10;
db.Delete(&User},
hertz
Kitex
- 定义IDL
- 服务注册与发现
- 使用kitex -module example -service example echo.thrift
- Echo 方法里写代码
- 创建Client c := xxxx.NewClient(client.withxxx)
- 发起了请求 c.Echo(context,Back.....callopt)
高质量代码与性能优化
高质量代码
-
高质量代码要求:
- 代码正确可靠
- 简洁清晰
- (容易扩展、思路清晰,容易读懂)
-
编程原则:
- 简单性:消除冗余;看不懂的代码别人难以维护
- 可读性:确保代码人能看懂
- 生产力:前后衔接降低出问题概率
-
代码格式:
- gofm自动格式化代码
- tools reformat code
- goImports
- Optimize imports
-
注释:
- 包中声明的每个公共符号、变量、常量、函数及结构都要加注释;
- 任何不明显且不简短的func必须注释
- 库中任何函数都要注释
- 解释代码作用+如何做的+解释代码实现原因+什么情况下会出错
-
命名规范:
- 变量:简洁而非冗长
- 缩略词全大写,头部且不需要导出用小写;
- eg:ServerHTTP、xmlHTTPRequest/XMLHTTPRequest
- 变量距离被使用的地方越远,需要携带的信息越多
-
功能:
- 函数名不带包名的上下文信息,包本身带某个词的话,func李不用再强调
- 尽量简短
-
包名:
- 只由小写字母组成,无大写字母和下划线
- 简短且包含一定上下文信息
- 不要与标准库同名
-
控制流程:
- 避免嵌套
- 尽量保持正常代码路径为最小缩进(尽早返回,今早判断错误)
-
错误和异常处理:
- error.As(err,&Patherr) // 可以把error的路径打印出
- panic(不建议在业务中使用panic)
- recover(只能在被defer的函数中使用)
- 嵌套无法生效
- 只在放弃goroutine生效
- defer语句后进先出
- 可以在recover中调用log把stack打印出来
性能优化
-
性能调优原则
- 依靠数据而非猜测
- 要定位最大瓶颈而非细枝末节
- 不要过早优化
- 不要过度优化
-
优化工具pprof
-
命令行模块结果查询(查别的部分把profile替换成heap、gorutine等即可)
go tool pprof "http://localhost:6060/debug/pprof/profile?second=10"
- 可视化结果查询
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
- tips:
- Flat == Cum 函数中没有调用其他函数
- Flat == 0 函数中只有其他函数的调用