Day2青训营笔记 | 青训营

57 阅读2分钟

go第三节课笔记

首先对于go语言的高并发有了一定的了解,在前面加个go以使用协程,如 go func(j int),协程用过通信共享内存而不是通过共享内存实现通信 。 关于Channel:一种引用类型,使用make创建。 格式为make(chan 元素类型,[缓冲大小]),

示例: src:=make(chan int) //无缓冲

desk:=make(chan int,2) //有缓冲

PPT截图! image.png 该程序实现了并发安全 缓冲用于解决生产和消费两端的效率问题。 实例:对一个变量进行2000次并发的+1,函数要加锁,不然会出错,出现的数值不确定,有并发安全的问题。 加锁方式:

func addWithLock(){
  for i:=0;i<2000;i++{
     lock.Lock()
     x += 1
     lock.Unlock()
    }
   }
   
复制代码

关于WaitGroup: 是一个关于协程的计数器 定义: image.png 实际使用:

image.png go的依赖管理: 三个阶段:GOPATH->Go Vendor->Go Module

GOPATH:{

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

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

src 项目源码

}

项目代码直接依赖sec下的代码 go get下载最新版本的包到src目录下 弊端:package只有一个版本,不能满足不同项目对于一个库的不同版本的依赖。

image.png Go Vendor x项目目录下增加vendor文件,所依赖的包副本形式放在$ProjectRoot/vendor

依赖寻址方式: vendor=>GOPATH

问题 1.无法控制以来的版本

2.更新项目有可能出现以来冲突,导致编译出错

image.png

Go Module 通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包

三要素:

1.配置文件,描述依赖 go.mod

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

3.本地工具 go get/mod

go.mod格式:

image.png 关于其中的依赖配置-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的,遗留下来的问题)

image.png

有多个版本依赖时选选择最低的兼容版本(即使图例再多一个1.5也选1.4)

image.png

依赖分发-Proxy 不建议直接拉

image.png

用Proxy可以保证依赖的稳定性

image.png

变量GOPROXY

image.png

关于工具 -go get

image.png

-go mod

image.png