这是我参与「第五届青训营 」伴学笔记创作活动的第 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保证依赖的稳定性。
删除某个依赖: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开发。