Go语言进阶 | 青训营笔记

30 阅读2分钟

语言进阶

并发:多线程程序在一个核上运行
并行:多线程程序在多个核上运行
协程:用户态,轻量级线程
线程:内核态,一个线程可以跑多个协程
go一次可以开启上万个协程,所以适合高并发,go开启协程非常简单,仅需要在调用函数前加上go即可开启goroutine
类似:go func(j int){}
go提倡通过通信共享内存,通过通道可以保证顺序 channel:make(chan 元素类型,[缓冲大小])
无缓冲通道:make(chan int) 有缓冲通道:make(chan int,2)
带缓冲的channel可以解决生产消费效率不一致的问题
并发安全Lock,当多个协程同时操作一块内存时不加锁会输出未知的结果

lcok sync.Mutex
lcok.Lock()
lock.Unlock

WaitGroup维护了一个计数器,计数器的值可以增加和减少,当计数器为0时表明所有的并发任务都完成

var wg sy  
wg.Add(5)  //计数器加5
wg.Done()  //计数器减1
wg.Wait()  //等待所有并发任务完成

依赖管理

依赖指的就是各种经过封装的开发包

GOPATH

环境变量 %GOPATH
项目代码直接依赖src下的代码
通过goget下载最新版本的包到src目录下
存在问题:无法实现某个package的多版本控制

Go Vendor

项目目录下增加vendor文件,所有依赖包放在vender下
依赖寻址方式:vendor->GOPATH
通过每个项目引入一份依赖的副本,解决了多个项目需要同一package依赖的冲突问题
问题:无法控制依赖的版本,更新项目可能出现依赖冲突

Go Module

通过go.mod文件管理依赖包版本
通过 go get/go mod 指令工具管理依赖包
go.mod文件:

module example/project/app //模块路径,依赖管理基本单元
go 1.16 //原生库
require( //单元依赖
     example/lib1 v1.0.2
     example/lib2 v1.0.0// indirect
     example/lib3 v3.2.0+incompatible //对于没有go.mod的文件且主版本2+的文件会加incompatible标识
)

go会选择最低的兼容版本
通过从Proxy拉取依赖稳定可靠