这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
多线程
线程与协程, 协程是更轻量级的线程,运行方式
go somefunc()
go func(param int){} (1)
方式2为匿名启用
通道
通道使用make(chan type) 或者make(chan type,2)创建,后者是有缓存的,可以存2个.
通道存数据chan<-value通道取数据则可以使用range
for i: range chan
go语言推荐使用Channel来在协程之间共享内存
锁
在执行某些任务的时候可以通过var lock sync.Mutex新建一个锁, 在对变量操作之前加锁,操作之后解锁
在lock()和unlock()之间的代码叫做临界区,一个时间只可以有一个goroutine执行,是线程安全的
依赖管理
从gopath 到go vendor 到go module渐渐演变.最常用的是go module
GoPath
/bin 内是编译的二进制文件,/pkg是中间产物,/src是项目源代码 之建议将src纳入版本管理
gopath有一个缺点,无法实现多版本控制
vendor
vendor就是把包存到vendor目录下,解决了上面的问题 问题是包A依赖C版本1,包B依赖C版本2,这样就会出现问题
gopath
可以使用go get/mod管理
//indirect 间接依赖 incompatible标记不兼容
编译的时候
编译的时候会选择满足编译条件的最低版本
GOProxy
GoProxy会缓存源站点的各包.
GOPROXY="proxy1.cn" "proxy2.cn" direct 意思是先访问1,在访问网站2,如果还是没有,访问原站点
GOGet
go get 地址 @tag
tag有以下几种
- @update默认
- @none 无依赖
- @v1.12.2 指定版本
- @23dddd4 commit
- @master 最新commit
Go Mod
go mod init 初始化
- download 下载模块
- tidy 删除不需要的依赖
Go测试
测试分为回归测试,集成测试,单元测试等.
回归测试,就是直接测试功能,比如说刷一下抖音
集成测试,是功能的测试.
单元测试,就是对代码进行测试
单元测试
输入指定的数值,再输出,看看值是否与期望的值相符合
测试规则
测试文件以_test.go结尾
测试函数为 func TestXxx(*test T)
逻辑初始化存于TestMain中
测试分支相互独立,全面覆盖,单元粒度足够小,职责单一