1 Go语言基础
1.1 数字解析
strconv包用来解析字符串和数字之间的转换
1.2 在线词典-抓包
API请求 curlconverter.com/#go 用来将将URL转译为相应语言代码
2 工程实践
2.1 语言进阶
2.1.1 并发VS并行
GO可以充分发挥多核优势,高效运行。
协程:用户态,轻量级线程,栈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)
defer close() 延迟的资源关闭
2.1.4 并发安全 Lock
不加锁会输出未知输出,是并发安全问题。
并发安全有一定概率发生,所以应该尽量避免
总结:
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
项目代码直接依赖src下的代码
go get 下载最新版本的包到src目录下
GOPATH-弊端
场景:A和B依赖于某一package的不同版本。
问题:无法实现package的多版本控制
2.2.1.2 GO Vendor
项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vender
依赖寻址方式:vender => GOPATH
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
vender 弊端
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
语义化版本
{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(可能存在不兼容的代码逻辑)
GO会选择最低的兼容版本
2.2.3 依赖分发-回源
存在问题:
无法保证构建稳定性:增加/修改/删除软件版本
无法保证依赖可用性:删除软件
增加第三方压力:代码托管平台负载问题
解决方法:Proxy
2.2.4 依赖分发-Proxy
服务站点:缓存服务器的软件内容
2.2.5 依赖分发-变量 GOPROXY
GOPROXY="proxy1.cn,https://proxy2.cn,…"
服务站点URL列表,“direct”表示源站
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 增加需要的依赖,删除不需要的依赖