Go语言入门工程实践 | 青训营笔记

65 阅读3分钟

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

1.主要内容

Go的进阶
Go的依赖管理
测试

2.本节详细内容

Go进阶知识点

  • Go提倡通过共享内存而不是通过共享内存实现通信
  • Go具有独特的轻量级协程Goroutine
  • Go 的并发原则非常优秀,目标就是简单:尽量使用 channel;把 goroutine 当作免费的资源,随便用。
  • Channel具有无缓冲和有缓冲两种,无缓冲为即时
  • 如果使用go的goroutine一定加锁,不加会有安全和逻辑问题
  • 使用WaitGroup进行协程的同步阻塞

依赖管理

  • 实际工程较为复杂,需要将涉及的框架、日志系统、驱动等通过SDK引入,需要对依赖包进行管理
  • Go的依赖管理发展为:GOPATH-Go Vendor-Go Module,目前主要使用Go Module

GOPATH

  • 项目直接依赖src下的代码
  • 多项目直接依赖同一个库中的同一份代码,不能依赖同一个库的不同版本,无法实现package的多版本控制

Go Vendor

  • 为了解决GOPATH的问题提出,通过每个项目引入一份依赖的副本解决
  • 当前项目存在vendor目录,会优先使用该目录的依赖,不存在则在GOPATH中寻找
  • 无法解决依赖包的版本变动与同一项目中依赖一个package中不同版本的问题,例如A依赖B和C,但B和C依赖了D不同版本
  • 更新项目有可能出现依赖的冲突,编译出错

Go Module

  • Go 1.16默认开启,一般称go mod
  • 通过go.mod文件管理依赖包版本,通过go get/go mod管理
  • indirect后缀表示间接依赖
  • incompatible后缀用在对于一些比较老的项目,可能当时go mod还没出现,但版本迭代到v2 以上,或者有些项目没有遵循更新版本原则,go mod为了能够正常使用它们,会使用这个后缀
  • go mod在处理A依赖B和C,但B和C依赖了D的1.3和1.4版本,最终编译时版本为1.4,使用最低兼容的版本
  • Go proxy是服务站点,缓存站中软件内容,缓存的软件版本不会改变,源站删除后也可用,使用Go proxy后,构建时会直接从Go proxy站点拉取
  • go mod提交前执行go tidy

测试

  • 单元测试的覆盖率一定程度决定代码质量
  • 回归测试人工手动固定主流场景,测试覆盖率较低

单元测试

  • 单元测试主要包括输入、测试单元、输出、校对
  • 所有测试文件以_test.go结尾
  • 初始化逻辑放到TestMain中
  • 单元测试评价为代码覆盖率,一般要求50-60%覆盖率,资金型80%,测试分支相互独立,测试单元粒度要够小。

基准测试

使用方法类似单元测试,用来测试程序的运行性能和占用,以Benchmark开头

3.项目实践

  • 需求为掘金社区话题,展示话题和回帖,实现本地web服务,话题和回帖数据使用文件存储
  • 整体分三层,数据层,逻辑层。数据层关联底层数据模型,面向逻辑层,对service层透明;Service逻辑层处理核心业务逻辑;Controller层负责处理交互
  • web框架使用gin,字节有自己的框架hertz

4.课后总结

  • 实践项目虽然篇幅较少但是需要再学习,gin框架较为常用
  • Go语言进阶中讲的goroutine、channel和锁是重点内容,需要对照课后的学习路线进行进一步的了解
  • 课程中的课程资料需要看看

5.引用

字节内部课:Go 语言入门 - 工程实践
go.dev/blog/using-…