这是我参与「第五届青训营 」伴学笔记创作活动的第2天
1.Go语言进阶,并发编程
1.使用并发编程时,只需要将要进行的操作封装进函数,使用go关键字启动,即可让另一个goroutine去执行它。
2.协程之间的并行是乱序的,父进程要花时间等待子进程(后面会讲解更为优雅的方式,见4),否则不等子进程运行,父进程就挂掉了。
func hello(i int) {
println("hello goroutine : " + fmt.Sprint(i))
}
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
2.协程间通信
后者依赖临界区,一定程度上会影响性能。而前者使用channel(通道),使用make来使用,分为有缓冲通道和无缓冲通道,区别在于有无阻塞。
3.使用lock来管理共享内存,尽管不推荐,,但是我们依然会使用共享内存,此时,就需要引入lock,对多进程中使用的共享内存的并发安全进行保护(实践中并发安全问题有概率出现,且难定位,每次出现问题时结果有可能不一样。)。
4.使用waitgroup进行协程间同步,共有三个方法,Add(增加计数器),Done(完成一个并发任务就-1),Wait(等待,直到计数器为0)。
2.依赖管理
“我们要学会站在巨人的肩膀上!”
1.Gopath,go语言的工作区。弊端:无法实现package多版本控制。
2.Go Vendor解决了刚刚的问题,每个项目引入依赖的副本解决依赖冲突问题。弊端:无法控制依赖版本。
3.Go Moudle:定义版本规则和管理项目依赖关系。
3.测试
1.单元测试,其覆盖率一定程度上决定了代码质量。
Tips:单元测试有三个规则约束:以_test.go结尾,函数名以Test开头,初始化逻辑在TestMain中。
2.mock测试:可以1.为函数打桩2.为方法打桩。(底层原理相当于把要调的那个函数的地址替换掉了)
3.基准测试框架:用来测试一段程序的运行性能和CPU损耗。可以通过此方法,寻找程序性能的瓶颈。
相关参考技术博客推荐
Go 语言并发编程系列(九)—— 利用多核 CPU 实现并行计算 - 腾讯云开发者社区-腾讯云 (tencent.com)
Go语言CSP:通信顺序进程简述 (biancheng.net)
(57条消息) 彻底搞懂golang的GOROOT和GOPATH_知更鸟女孩的博客-CSDN博客_golang gopath goroot