go语言进阶 | 青训营笔记

150 阅读2分钟

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

goroutine

协程对比线程的优势:

  1. 存在于用户态,可操作性强,调度可由自己控制。
  2. 更轻量,所需资源更少。

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

依赖管理三要素

  1. 配置文件,描述依赖 (对应go.mod)
  2. 中心仓库管理依赖库 (GoProxy)
  3. 本地工具 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中的协程,依赖管理,测试,性能优化 这一部分的进阶知识比较难懂,而且如果真正掌握还需要花更多的时间,这里只是做初步的了解。将来实践时用到了在进一步掌握。