这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
goroutine
协程对比线程的优势:
- 存在于用户态,可操作性强,调度可由自己控制。
- 更轻量,所需资源更少。
channel
func main() {
var src chan int
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 {//消费者1
dest <- i * i
}
}()
for i := range dest {//消费者2
println(i)
}
}
复制代码
src 是生产者,dest是消费者 dest定义的时候带缓冲,类似于java线程中的阻塞队列,如果任务数量满了则进入阻塞状态 使用带缓冲channel的好处 在一个生产者消费者模型中,生产者的生产效率远高于消费者,那么可以使用带缓冲的channel,防止生产者因为等待消费者消费过程而产生阻塞。反之对消费者来说也是受用的。 注意:channel是类似于引用的一个类型,如果直接通过var声明定义是没法初始化得到内部内存的,故记得通过make创建channel。还有就是记得不用的时候关闭。
Go Module
依赖管理三要素
- 配置文件,描述依赖 (对应go.mod)
- 中心仓库管理依赖库 (GoProxy)
- 本地工具 go get/mod
版本选择最低的兼容版本
go mod init //初始化生成go.mod文件 go mod download //下载模块到本地缓存
go mod tidy // 增加所需依赖,删除不需要的依赖
测试
对于文件a.go,测试文件需命名为 a_test.go 测试函数以Test开头
go test -v --cover //显示覆盖率
go test -bench=. -benchmem //内存
性能优化
使用空结构体节省内存
m:=make(map[int]struct{})
复制代码
如果map中只需要键值(set实现)则将val设置为空结构体可节省内存 struct{}不占据任何内存空间,仅作为占位符
总结
主要学习了go中的协程,依赖管理,测试,性能优化 这一部分的进阶知识比较难懂,而且如果真正掌握还需要花更多的时间,这里只是做初步的了解。将来实践时用到了在进一步掌握。