Golang工程实践笔记 | 青训营笔记

201 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

  • 协程在用户态实现,系统开销小,所以天生支持高并发。

  • 提倡通过通信共享内存,也就是channel.不提倡通过共享内存通信,也就是加锁

  • 有缓冲(异步)、无缓冲通道(同步),make(chan int, 2)

  • 带缓存可以解决消费者消费慢的阻塞问题,即消费者消费速度慢,生产者可以不必阻塞在channel

  • 不提倡通过共享内存通信,也就是加锁,不加锁不能保证并发安全

  • waitGroup实现并发同步,不用sleep。有add,done,wait三个常用函数

  • 总结:goroutine,channel通信,同步

依赖管理:

  • 需求:不同项目依赖版本不同,需要控制不同版本

  • GOPATH:bin项目编译二进制文件,src源码。项目代码直接依赖src源码,go get 下载到src下。无法实现包的多版本控制

  • Go Vendor: 项目下增加vendor,依赖包的副本放在这里,现在这里找,找不到再去gopath->src,解决了多个项目需要同一个包的不同版本问题。存在问题:A包含的B、C却包含了D的不同版本,不兼容

1651985327296.png

  • go module:1.11开始引入,1.16默认开启。go.mod文件管理,描述依赖。中心仓库管理依赖库proxy。本地工具 go mod/get。

  • version描述:1语义化版本:V1.3.0,V2.3.1.major,minor,patch 2基于 commit伪版本。indirect:非直接依赖。incompatible

  • 常用指令 go mod init,go mod download,go mod tidy test

  • 回归测试,集成测试,单元测试

  • TestMain() ,代码覆盖率--cover

  • 指令:go test .\judgment_test.go .\judgment.go --cover

  • 一般覆盖率50-60,较高覆盖率80+

  • 单元测试要粒度小,覆盖全

  • mock 代替原函数,

  • 并发测试用range,它有一个全局并发锁,在并发时性能反而差了。fastrand快了很多