这是我参与「第三届青训营 -后端场」笔记创作活动的的第二篇笔记
本节课程从工程实践的角度,了解Go开发的知识点。
主要内容:
- 语言进阶:从并发编程的时角了解Go高性能本质
- 依赖管理:了解Go语言依赖管理的演进路线
- 测试:从单元测试实践出发,提升质量意识
- 项目实战
并发VS并行
Go可以充分发挥多核优势
协程和线程
-
协程:用户态,轻量级线程,栈MB级别
-
线程:内核态,线程跑多个协程,栈KB级别。
1.1 Goroutine
goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。
1.2 CSP (Communicating Sequential Processes)
提倡通过通信共享内存(通道通信)而不是通过共享内存(各个Gorountine用一个领界区)而实现通信
1.3 Channel
一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。
make(chan 元素类型,[缓冲大小])
例子:
// 保证并发安全输出平方数
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
defer close(src)
for i:= 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
for i := range dest {
println(i)
}
}
1.4 并发安全 Lock
加锁lock sync.Mutex实现并发安全
2 依赖
govendor 是 GoLang 常用的一个第三方包管理工具,它的出现解决了不同用户在 clone 同一个项目时从外部获取不同依赖库版本的问题。
从 Go1.11 开始, Go 官方加入 Go Module 支持, Go1.12 成为默认支持; 从此告别源码必须放在 Gopath 中 以及 Gopath 对初学者造成的困扰.
执行go mod vendor命令,会将下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下, 此时我们就可以使用这些依赖了
项目编译时会选择最低的兼容版本(而不是编译多个选择的版本)
go mod init # 初始化 go.mod
go mod tidy # 更新依赖文件(增加需要的依赖,删除不需要的依赖)
go mod download # 下载依赖文件到本地
go mod vendor # 将依赖转移至本地的 vendor 文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖
3 测试
学习了单元测试和基准测试相关包和操作