GO语言进阶|青训营笔记

65 阅读3分钟

前言

这是我参与【第五届青训营】伴学笔记活动第二天,今天主要学习了线程,协程,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后,对于程序的运行还有包的管理依赖显得更快捷更简便。