L1 Go快速上手
1.简介
高性能,高并发,语法简单,标准库,工具库,跨平台,静态链接,垃圾回收 部署简单学习成本低,内部RPC和HTTP框架的推广
2.入门
3.实战
3.1 猜谜游戏
生成随机数:生成 用时间戳来初始化随机数的种子 fmt输入 一行输入+去掉换行符+转换成数字
3.2 在线字典
抓包 fanyi.caiyunapp.com/
生成代码 https://curlconverter/#go
找到dict curl bash代码 生成go代码(创建请求,设置请求头,发起请求,读取响应)
生成Requestbody,解析response body oktools.net/json2go
源代码: hi-hi.cn/go
3.3 socks5代理
client socks5 server host
L2 Go语言入门 工程实践
1.语言进阶
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
Go可以充分发挥多核优势,高效运行
1.1 Goroutine
线程:用户态,轻量级线程,栈KB级别。
协程:内核态,线程跑多个协程,栈MB级别。
1.2 CSP commuting sequential processes
通道和临界区
提倡通过通信共享内存而不是通过共享内存实现通信
1.3 channel
make(chan 元素类型, [缓冲大小])
无缓冲通道 make(chan int)
有缓冲通道 make(chan int,2)
1.4 并发安全Lock
1.5 WaitGroup
计数器
开启协程+1;执行结束 -1;主协程阻塞直到计数器为0。
小结: Goroutine
channel
sync
2 依赖管理
复杂项目管理依赖库
依赖管理演进
GOPATH --> Go Vender --> Go Module
不同环境(项目)依赖的版本不同
控制依赖库的版本
2.1 GOPATH
环境变量 $GOPATH
项目代码直接依赖src下的代码
go get下载最新版本的包到src目录下
弊端:A和B依赖于某一package的不同版本
问题:无法实现package的多版本控制
2.2 Go Vendor
项目目录下增加vendor文件,所有依赖包副本形式放在 $ProjectRoot/vendor
依赖寻址方式: vendor => GOPATH
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
弊端: 无法控制依赖的版本。 更新项目由可能出现依赖冲突,导致编译出错。
2.3 Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod 指令工具管理依赖包
终极目标:定义版本规则和管理项目依赖关系
依赖管理三要素:
1.配置文件,描述依赖 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/mod
依赖配置:选择最低的兼容版本
依赖分发 回源 Proxy
3 测试
单元测试
mock测试
基准测试