go第三节课笔记
首先对于go语言的高并发有了一定的了解,在前面加个go以使用协程,如 go func(j int),协程用过通信共享内存而不是通过共享内存实现通信 。 关于Channel:一种引用类型,使用make创建。 格式为make(chan 元素类型,[缓冲大小]),
示例: src:=make(chan int) //无缓冲
desk:=make(chan int,2) //有缓冲
PPT截图!
该程序实现了并发安全 缓冲用于解决生产和消费两端的效率问题。 实例:对一个变量进行2000次并发的+1,函数要加锁,不然会出错,出现的数值不确定,有并发安全的问题。 加锁方式:
func addWithLock(){
for i:=0;i<2000;i++{
lock.Lock()
x += 1
lock.Unlock()
}
}
复制代码
关于WaitGroup: 是一个关于协程的计数器 定义:
实际使用:
go的依赖管理: 三个阶段:GOPATH->Go Vendor->Go Module
GOPATH:{
bin: 项目编译的二进制文件
pkg 项目编译的中间产物,加速编译
src 项目源码
}
项目代码直接依赖sec下的代码 go get下载最新版本的包到src目录下 弊端:package只有一个版本,不能满足不同项目对于一个库的不同版本的依赖。
Go Vendor x项目目录下增加vendor文件,所依赖的包副本形式放在$ProjectRoot/vendor
依赖寻址方式: vendor=>GOPATH
问题 1.无法控制以来的版本
2.更新项目有可能出现以来冲突,导致编译出错
Go Module 通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包
三要素:
1.配置文件,描述依赖 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/mod
go.mod格式:
关于其中的依赖配置-vrsion: 语义化版本
{MAJOR}.{MINOR}.{PATCH}
MAJOR:大版本。不同大版本间可以不兼容,代码隔离
MINOR:新增一些函数和功能用,要保持在大版本MAJOR下做到见后兼容
PATCH:修订号,一般做一些代码的问题的修正
示例:V1.3.0 V2.3.0
基于commit伪版本 VX.0.0-YYYYMMDDHHMMSS-ABCDEFGH1234 版本前缀(和语义化一样)-一个时间戳-一个12位的哈希码前缀
依赖配置: 如A->B->C { A->B 直接依赖 A->C 间接依赖 } go.mod会加//indirect 表示非直接依赖
+incompatible 标识出来可能存在一些不兼容的代码逻辑(在1.11前的工程是不用go.mod的,遗留下来的问题)
有多个版本依赖时选选择最低的兼容版本(即使图例再多一个1.5也选1.4)
依赖分发-Proxy 不建议直接拉
用Proxy可以保证依赖的稳定性
变量GOPROXY
关于工具 -go get
-go mod