这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记,在学习了go语言的基本语法和了解了go语言的基础特性后,跟随讲师的讲解,开始使用go语言进行简单的工程项目实践,增加对go语言的熟悉度。
- go语言知识点:
- Go可以充分发挥多核优势,高效运行
- 协程与线程:
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个(上万个)协程,栈MB级别。
- 怎么开启协程:
go func(j int) {
hello(j)
}
-
Channel:用来协程间进行通信的 make(chan元素类型,[缓冲大小])· 无缓冲通道 make(chan int) 有缓冲通道 make(chan int,2) 生产者消费者模型,channel在左边就是写入,在右边就是读取
-
并发安全Lock
-
WaitGroup
Add(m int) 计数器加m
Done() 计数器减一
Wait()
- 工程依赖管理
-
Go path ---> Go Vendor --->Go Module
-
依赖管理三要素:类似Maven
配置文件,描述依赖 go.mod
中心仓库管理依赖库 Proxy
本地工具 go get / go mod
-
版本1.1.1第一个是大版本,可能不兼容,第二个保证兼容,第三个一般是修改bug。1.3和1.4,保证最低兼容要求是选1.4
-
a-->b -->c :a对b是直接依赖,a对c是间接依赖
-
依赖分发:Proxy:保证稳定可靠
GOPROXY="httpa://proxy1 -->proxy2 -->.cn, https://proxy2.cn ,direct”
服务站点URL列表,“direct”表示源站
proxy1 -->proxy2 -->direct
- 工具: go get go mod : init (初始化)/ download (下载模块到本地)/ tidy(增加需要的依赖,删除不需要的依赖,每次提交前可以执行一次)
- 单元测试
-
测试单元:模块、函数、....
-
规则:
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
-
覆盖率:--cover
有多少代码被验证了
- 一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支保证相互独立、全面覆盖
- 测试单元保证粒度足够小,函数单一职责
-
依赖:**>稳定&幂等
不能依赖于不稳定的网络、本地文件等,
需要Mock机制保证稳定&幂等性,打桩?不依赖于本地文件?
-
基准测试
rand要竞争锁,高并发情况下有性能问题