笔记整理(第一周) | 字节青训营

79 阅读4分钟

字节青训营笔记(第一周)

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

  • 结果统计页面 http://localhost:6060/debug/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 函数中只有其他函数的调用