Go语言入门(二) | 青训营笔记

160 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

上一节的培训课讲解了一些简单的go语言基础,这节课会和老师一起探究工程实践的流程,这是项目地址github.com/Moonlight-Z…

GO并发

协程

完整程序参见go-project-exmple/concurrence/goroutine.go文件,注意主Go程sleep一秒的原因是五个子协程并发运行,和主线程不是在同一个时间段,当主Go程执行结束,5个协程还没有完成打印功能,从而被迫终止,因此主Go程这里主动等待

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 image.png

WaitGroup

上面的通过sleep来进行主线程等待,还有一种方法通过waitgroup来实现,下面是多个协程带打印hello gorouting的例子,现在我们用watigroup实现协程的同步阻塞。首先通过add方法,对计数器+5,然后开启协程,每个协程执行完后,通过done对计数器减少1,最后wait主协程阻塞,计数器为0 退出主协程。 image.png

依赖管理

1. GOPATH

GOPATH是Go语言支持的一个环境变量,value是Go项目的工作区。目录有以下结构:src:存放Go项目的源码;pkg:存放编译的中间产物,加快编译速度;bin:存放Go项目编译生成的二进制文件

$GOPATH/bin/#项目编译的二进制文件
$GOPATH/pkg/#项目编译的中间产物,加速编译
$GOPATH/src/#项目源码

image.png

但是gopath有个弊端,如上图所示,同一个pkg,有2个版本,A->A(),B->B(),而src下只能有一个版本存在,那AB项目无法保证都能编译通过。也就是在gopath管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本。

2. go vendor

Vendor 是当前项目中的一个目录,其中存放了当前项目依赖的副本。在Vendor机制下,如果当前项目存在Vendor目录,会优先使用该目录下的依赖,如果依赖不存在,会从GOPATH中寻找。

3. go module

  • Go Modules 是Go语言官方推出的依赖管理系统,解决了之前依赖管理系统存在的诸如无法依赖同一个库的多个版本等问题,go module从Go 1.11 开始实验性引入,Go 1.16 默认开启;我们一般都读为go mod.
  • 首先是indirect后缀,表示go.mod对应的当前模块,没有直接导入该依赖模块的包,也就是非直接依赖,标示间接依赖

image.png

总结

这节课学到许多go语言实际开发需要用到的地方,对以后的学习工作提供了 帮助,有错误的地方欢迎大家指出来一起探讨!!