这是我参与「第五届青训营 」笔记创作活动的第3天。今天整理一下之前Go语言进阶课&依赖管理的笔记~
Go语言相比于其他语言有一个显著的优势:多核,并行运行。能够用goroutine开协程,一个线程可以同时跑多个协程,栈为KB级。一个简单的使用方法是用go func()开启。如下面这段代码:
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)
}
}
就可以实现五次打印。此外,协程之间可以用channel实现通信,具体用法是make(chan 元素类型, [缓冲大小]->optimal)。为了保证协程运行安全,类似于线程,进程的加锁操作,可以对协程进行一组Lock()和UnLock操作。多个协程同时运行时,可用WaitGroup维护一个计数器,开启协程和结束协程,计数器会+-1,并且资源被占有时会阻塞其他协程直至计数器为0。
Go语言的依赖管理也是搭建工程项目的一个必要内容。其主要经历了GOPATH,Go Vender和Go mod(目前使用)的演进过程。GOPATH类似一种环境变量的管理方式,整个项目编译后由三部分src, pkg, bin构成,项目直接依赖src下的代码,而go get会将最新版本的包下载到src目录下。如此一来则出现了无法实现多版本控制的问题:
stateDiagram-v2
projectA --> pkg_v1,funcA()
projectB --> pkg_v2,funcB()
如图,A,B函数对应pkg的不同版本,则会出现问题。
为解决这一问题,Go Vender在项目目录下增加Vender文件,所有依赖包副本文件会放在$ProjectRoot/Vender,然而又如图所示:
更新项目会引发依赖冲突而编译出错。
目前主要采用Go Module的形式,即通过go mod文件管理依赖配置。所有配置项都会以一定的格式写入文件中,会区分直接依赖,间接依赖(//indirect)和不可用依赖(+inompatible)。 采用GoProxy分发依赖,go get下载特定依赖。 go mod有几个特殊命令:
- init:初始化,建立go mod文件
- download:下载模块到本地缓存
- tidy:增加需要的依赖,删除不需要的依赖
本节课的内容让我对于Go语言开发的一些框架性的内容有了一个更深的了解。