Go语言进阶|青训营笔记

61 阅读2分钟

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

内容要点:goroutine、channel、依赖管理、单元测试、项目分层框架、项目实战

goroutine

线程是内核层的,协程是用户层的。 协程比较小,可以运行数万个协程。

channel

go语言提倡通过通信来实现共享内存,而不是通过共享内存实现通信。所以有了channel。

无缓冲通道,同步通道

有缓冲通道

channel的使用如下:

func CalSquare() {
   src := make(chan int)
   dest := make(chan int, 3)
   go func() {
      defer close(src)
      for i := 0; i < 10; i++ {
         src <- i
      }
   }()
   go func() {
      defer close(dest)
      for i := range src {
         dest <- i * i
      }
   }()
   for i := range dest {
      //复杂操作
      println(i)
   }
}

可以使用sync.WaitGroup来阻塞主线程,等待其他协程执行完毕之后,我们主线程继续执行。关键函数是Done函数和Wait函数。

依赖管理

go的依赖管理发展路径。:gopath -> go vender-> go module

依赖管理的三要素:

1、配置文件,描述依赖。 go.mod

2、中心仓库管理依赖库。 proxy

3、本地工具 go get/mod

使用proxy保证依赖的稳定性。

QQ截图20230116144818.png

删除某个依赖:go get example.org/pkg @none 使用none

go mod的相关操作:

go mod init 初始化,创建go.mod文件

go mod download 下载模块到本地

go mod tidy 增加需要的依赖,删除不需要的依赖。

go 的测试:

单元测试、Mock测试、基准测试。

如何衡量代码是否经过了足够的测试?如何评价项目的测试水平?如何评估项目是否达到了高水准测试等级。 使用代码覆盖率来判断上述指标。一般要求覆盖率50%-60%,较高要求的话需要达到80%。测试分支相互独立、全面覆盖。测试端元力度足够小,函数单一职责。

幂等:重复测试的时候,得到的结果是一致的。

稳定:单元测试相互隔离,任何时间任何函数都可以执行。

基准测试:优化代码,需要对当前代码分析,内置的测试框架提供了基准测试的能力。

go项目分层结构

数据层:数据model,外部数据的增删改查。

逻辑层:业务enitidy,处理核心业务逻辑输出。

视图层:视图view,处理外部的交互逻辑。

个人收获

学习了goroutine,了解了go语言在并发编程上的优势,经过练习课程提供的代码,体验到了go语言中并发编程的简便性,然后通过channel实现协程之间的通信。后面了解go的依赖管理以及测试相关的知识,进一步扩展了我的知识库。最后的go项目使用gin框架,初体验了基本的goweb开发。