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. 增加需要的依赖,删除不需要的依赖