GO语言基础以及依赖管理 | 青训营

117 阅读3分钟

1 Go语言基础

1.1 数字解析

strconv包用来解析字符串和数字之间的转换

1.2 在线词典-抓包

API请求 curlconverter.com/#go 用来将将URL转译为相应语言代码

2 工程实践

2.1 语言进阶

2.1.1 并发VS并行

GO可以充分发挥多核优势,高效运行。

image.png

协程:用户态,轻量级线程,栈KB级别

线程:内核态,线程跑多个协程,栈MB级别

GO语言中开启协程的方式:在调用函数时,在函数前面加上go

2.1.2 CSP

CSP: 提倡通过共享内存而不是通过共享内存而实现通信。

GO提倡通过通信共享内存,但也有共享内存实现通信。

2.1.3 Channel

channel是一种引用类型,需要用make来创建。

格式为:make(chan 元素类型,[缓冲大小])

无缓冲通道 make(chan int)

有缓冲通道 make(chan int,2)

image.png

defer close() 延迟的资源关闭

2.1.4 并发安全 Lock

不加锁会输出未知输出,是并发安全问题。

并发安全有一定概率发生,所以应该尽量避免

image.png

image.png

总结:

1.协程:GO可以通过高效的调度模型,来实嵌高并发的操作。

2.通道channel:通过通信实现共享内存

3.Sync:lock、协程同步、并发安全操作

2.2 依赖管理

站在巨人的肩膀上,善于使用库

背景:管理依赖库,工程项目不可能基于标准库0~1编码搭建

2.2.1 GO依赖管理

发展历程:GOPATH -> Go Vendor -> Go Module

不同环境(项目)依赖管理的版本不同,控制依赖库的版本

2.2.1.1 GOPATH

环境变量 $GOPATH

image.png

项目代码直接依赖src下的代码

go get 下载最新版本的包到src目录下

GOPATH-弊端

image.png

场景:A和B依赖于某一package的不同版本。

问题:无法实现package的多版本控制

2.2.1.2 GO Vendor

项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vender

依赖寻址方式:vender => GOPATH

image.png

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。

vender 弊端

image.png

1无法控制依赖的版本;2更新项目又可能出现依赖冲突,导致编译失败。

2.2.1.3 GO Module

通过go.mod文件管理依赖包版本

通过go get/go mod 指令工具管理依赖包

终极目标:定义版本规则和管理项目依赖关系

2.2.2 依赖管理三要素

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

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

3.本地工具 go get/mod

2.2.2.1 依赖配置-go.mod

module example/project/app 依赖管理基本单元

go 1.16 原生库

require (

example/lib1   v1.0.2      **单元依赖**

example/lib2   v1.0.0  // indirect

example/lib3   v0.1.0-20190725025543-5aalskdf

example/lib4   v0.0.0-2018030612644-bacd9c7ef1dd  // indirect

example/lib5/v3   v3.0.2

example/lib6   v3.2.0+incompatible

)

依赖标识:[Module Path][Version/Pseudo-ersion]

2.2.2.2 依赖配置-version

语义化版本

MAJOR.{MAJOR}.{MINOR}.${PATCH}

V1.3.0

V2.3.0

MAJOR 大版本,不同的MAJOR版本可以是不兼容的(代码隔离)

MINOR 做一些新增函数或功能,在MINOR下保持兼容

PATCH 做一些代码bug修复

基于commit伪版本

vX.0.0-yyyymmddhhmmss-abcdefgh1234

v0.0.0-20220401081311-c38fb59326b7

v1.0.0-20201130134442-10cb98267c6c

vX.0.0 版本前缀

yyyymmddhhmmss 时间戳

abcdefgh1234 哈希码前缀

2.2.2.3 依赖配置-indirect

//indirect 非直接依赖

+incompatible

主版本2+模块会在模块路径增加/vN后缀

对于没有go.mod文件并且主版本2+的依赖,会+incompatible(可能存在不兼容的代码逻辑)

image.png

GO会选择最低的兼容版本

2.2.3 依赖分发-回源

image.png

存在问题:

无法保证构建稳定性:增加/修改/删除软件版本

无法保证依赖可用性:删除软件

增加第三方压力:代码托管平台负载问题

解决方法:Proxy

2.2.4 依赖分发-Proxy

服务站点:缓存服务器的软件内容

image.png

2.2.5 依赖分发-变量 GOPROXY

GOPROXY="proxy1.cn,https://proxy2.cn,…"

服务站点URL列表,“direct”表示源站

image.png

2.2.6 工具-go get

go get example.org/pkg :

@update 默认

@none 删除依赖

@v1.1.2 tag版本,语义版本

@23dfdd5 特定的commit

@master 分支的最新commit

2.2.7 工具-go mod

go mod

init 初始化,创建go.mod文件

download 下载模块到本地缓存

tidy 增加需要的依赖,删除不需要的依赖