这是我参与「第五届青训营 」笔记创作活动的第2天。
1 重要内容
- 语言进阶
- 依赖管理
- 测试
2 详细内容
2.1 语言进阶
从并发编程的视角了解Go语言高性能的本质
协程
- 是一个比线程更轻量级的资源单位,栈KB单位
CSP
- 提倡通过通信实现共享内存
Chanel
- make(chan 元素类型,[缓存大小])
- 无缓存通道会同步化
并发安全-sync
Mutex是最简单的一种锁类型,同时也比较粗暴,当一个goroutine获得了Mutex后,其他goroutine只能乖乖等待这个goroutine释放该Mutex.通过调用Lock()方法对Mutex上锁,通过调用Unlock对Mutex解锁。
WaitGroup-sync
通过使用sync.WaitGroup,可以阻塞主线程,直到相应数量的子线程结束。一般用于等待一组线程的结束。 在sync.WaitGroup结构体对象中有三个方法,Add()、Done()、Wait()。Add()方法主要为WaitGroup的等待数+1或者+n;Done() 方法会减少WaitGroup计数器的值,一般在goroutine的最后执行;Wait()方法 阻塞当前协程,直到等待数归为0才继续向下执行。
- 主函数中使用Wait()方法 一直阻塞,直到wg为零——也就是所有的100个for循环都运行完毕 waitgroup简单演示
2.2 依赖管理
依赖管理的演进路线
演进路线
- gopath src是项目源码,pkg是存放编译的中间产物,bin存放GO项目的二进制文件。无法实现pkg的多版本控制。 src下只能有一个pkg。
- govendor vendor目录存放当前项目依赖的副本。但是不好解决依赖包的版本变动。
- gomodule 通过go.mod文件管理依赖包版本
依赖三要素
- go.mod
模块路径,go版本号,单元依赖
一个 module 的版本号规则必须遵循语义化规范:v(major).(minor).(patch)格式。major: 大版本,发生不可兼容的改动时增加该版本;minor:小版本,当有新特性时增加该版本;patch:补丁版本,当有bug修复时增加该版本。
- proxy
依赖如何下载,在哪里下载?
- go get/mod
2.3 测试
单元测试实践出发
3 个人总结
讲授了一些关于go语言的运行原理,以及解释了刚开始配置环境的时候出现的种种问题。