前言
这是我参与【第五届青训营】伴学笔记活动第二天,今天主要学习了线程,协程,Channel,并发lock,WaitGroup,GO依赖管理,以及一些实例讲解。
正文
多线程
GO可以充分发挥多核优势高效运行{ 1.多线程程序在一个核的cpu上运行 2.多线程程序在多个核CPU上运行 }
协程
协程:用户态轻量级线程,栈KB级别, 线程:内核态,线程跑多个协程栈KB级别 协程创建:调用函数时在函数前加个go关键字 协会才能之间的通信:通过通信共享内存 通道将协程进行连接,(提倡) 通过共享内存实现通信:要获取临近值
Channel
make (chan 元素类型) 可根据缓冲大小分为无缓冲通道 make(chan int)(同步通道) 有缓冲通道make(chan int,2)(通道容量代表存储多少元素)
A:子协议发送0~9数字 B;子协议计算输出协议的平方,主程序输出最后的程序
funct CalSquare(){
src :=make(chan int)//无缓冲通道
dest :=make(chan int,3)//有缓冲通道
go fun(){
defer close(src)
for i:=0;i<10;i++{
src←i
}
}()//A过程,for循环建立生产数字0~9发送到src中
go fmnc (){
defer close (dest)
for i=range srl{
dest←i*i
}
}()//通过range变src中数字,用有缓冲通道
for i=range dest{
println(i)
}
}
waitgroup
Add(delta int)计数器+delta Done() 计数器-1 Wait()阻塞直到计数器为0
计数器
开始协程+1;执行结束-1;主协程阻塞直到计数器为0并发任务都完成
func Many GoWait(){
var wg .Add (delta s) //开始五个协程
for i:=0; i<s; i+t{
go func (j int){
dlefer wg.done()//对计数器-1.主协程任务执行结束
hello (i)
}(i)
wg.wait() //进行阻塞
}
Go依赖管理
1不同环境依赖的版本不同
2控制依赖库的版本
GOPATH(环境变量)
bin 项目编译的二进制文件
pkg项目编译的中间产物加速编译
src项目源码 1项目代码直接依赖src下的代码
2go get下载最新版本的包到src目录下
3问题;无法实现package的多版本控制
Go vender
1项目目录下增加vendor文件,所有依赖包副本形式方式$ProjectRoot/vendor
2依赖寻址方式;endor ⇨GoPATH
3通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
4弊端:
1无法控制依赖的版本
2更新项目有可能出现依赖冲突导致编程出错
Go Moudle
1通过go mod文件管理依赖包版本
2通过go get/go mad指令公举管理依赖包
3终极目标:定义版本规则和管理项目依赖关系
依赖管理三要素
1配置文件,描述依赖 go mod
2中心仓库管理依赖库 Proxy
3本地工具 go met/mod
个人总结
这次的学习解开了我许多刚安转go语言使用时的问题,go.mod文件我一开始并不知道具体作用,只是盲目的使用,我认为运用go.mod后,对于程序的运行还有包的管理依赖显得更快捷更简便。