Go 语言进阶与依赖管理丨青训营笔记

45 阅读2分钟

1.      并发:多线程程序在一个核上运行,通过时间片的切换实现同时运行。

 

2.      并行:多线程程序在多个核的CPU上运行

GO语言可以充分发挥多核优势,高效运行。Go是为并行而升。

 

协程:用户态,轻量级线程,栈KB级别。耗资源少。

线程:内核态,线程跑多个协程,栈MB级别。较耗资源。

编码调用协程:函数前加go:

 

 

通过通信共享内存,即通道传播信息。

通过共享内存实现通信。会申请一个临界区权限进行加速操作,但会有受信态问题,容易影响性能。

提倡通过通信共享内存而不是通过内存而实现通信。

 

Channel:

创建:make(chan 元素类型, [缓冲大小])

1.      无缓存通道

2.      有缓存通道:通道容量代表通道中可存放的元素

 

并发安全:Lock

lock sync.Mutex.

{lock.Lock()//先打开临界区

Lock.Unlock()//释放临界区内存,控制并发}

并发安全有概率出现。

 

WaitGroup:

计数器:

Add(delta int):开启协程+delta

Done():执行结束-1

Wait():阻塞直到计数器为0

 

代码:

var wg sync.WaitGroup//定义

wg.Add(delta: 5)//加入5个协程

for i := 0 ; i<5; i++{

go func( j int ) {

       defer wg.Done()//每进行一个协程就关闭一个

       hello(j)

       }(i)

}

wg.Wait()//进行阻塞

 

GO依赖管理

演进:GOPATH->Go Vendor->Go Module

1.      不同环境(项目)以来的版本不同

2.      控制依赖库的版本

 

(1)      环境变量:$GOPATH

bin: 项目编译的二进制文件

pkg: 项目编译中间产物,加速编译

src:项目源码;项目代码直接以来src下的代码

(2)      Go Vendor

·         项目目录下增加vendor文件,所以依赖包副本形式放在$ProjectRoot/vendor

·         寻址方式:vendor=>GOPATH

(3)      Go Module

·         通过go.mod文件管理依赖包版本

·         go get/go mod 指令工具管理依赖包

 

依赖管理三要素

1.      配置文件,描述依赖  

go,mod

代码:

Module path 依赖管理基本单元

go 1.16 原生库

require 单元依赖

(

        …

)

依赖配置-version

 

2.      中心仓库管理依赖库    Proxy

3.      本地工具 go get/mod

选B,选择最低的兼容版本

 

依赖分发-回源-proxy

直接使用版本管理仓库下载依赖会存在问题:

 

依赖分发-变量 GOPROXY

 

go get example.org/pkg

1.@update 默认

2.@none 删除依赖

3.@v1,1,2 tag版本,语义版本

4.@23dfdd5 特定的commit

5.@master 分支的最新commit

go mod

1.      init  初始化,创建go.mod文件

2.      下载模块到本地缓存

3.      增加需要的依赖,删除不需要的依赖