这是我参与「第五届青训营 」伴学笔记创作活动的第2天,今天难度比昨天高,前面还是能跟上,到后面实现项目那里确实晕😵,这几天抓紧时间啃下来。
1 语言进阶
1.并发与并行
1.1 gorotine
go可以充分发挥并发优势
协程,用户态的轻量级线程,协程kb,内核态线程mb
例子
实现快速,开启协程运行
go语言中只需在函数前加go关键字就可创建协程,并行
创建协程非常方便
1.2 csp
channel:通过通信共享内存,信号量:共享内存实现通信
在计算机系统学习了信号量的实现,确实可能发生并发安全所以用信号量进行互斥
老师稍微讲了下原理,目前是囫囵吞枣的状态,回头在细细分析二者的优劣及差异
1.3 channel
make关键字(chan元素类型,缓冲大小)
有无缓冲大小代表 有无缓冲通道
defer close 延迟关闭
//创建名为src的channel,传递数据到src
src:=make(chan int)
go func(){
defer close(src)
for(i:=0;i<10;i++){
src<-i
}
}
sync:
1.4 并发安全lock
共享内存保持通信,发生数据映态 协程之间通信
1.5WaitGroup
无法知道阻塞时间,无法知道该sleep多久
add(),done(),wait()
计数器
开启协程+1,结束-1,主协程阻塞直到为0
2依赖管理
这一部分非常好理解
个人认为一句话,就是解决依赖包的版本冲突问题
运用依赖包,管理依赖包非常重要
2.1依赖管理演变:
gopath,go vendor,go module
不同环境版本不同
2.1.1 gopath
项目代码直接依赖src的代码
弊端,a项目与b项目依赖同一pkg的不同版 本,无法实现多版本控制
2.1.2 go vendor
增加vender文件,每个项目都引入一份依赖的副本
解决多个项目需要同一个pkg依赖的冲突,
但可能间接
2.1.3 go module
通过 go.mod文件管理依赖包版本
通过go get/go mod 指令管理pkg
2.2依赖管理三要素
配置文件 go.mod
中心仓库管理依赖库 peoxy
本地工具 go get/mod
2.3 依赖管理 - go.mod
2.3.1依赖管理基本单元
元素库
单元依赖
依赖标识:[mod path][version]
2.3.2 依赖配置 - version
语义化版本
major-minor-patch
major:可不兼容
minor:新增函数
patch:修bug
伪版本 默认生成伪版本号
2.3.3依赖配置 -indirect
直接依赖direct,间接依赖indirect
2.3.4 incompatible
无go.mod,且为2.0依赖加上+incompatible
2.3.5 配置依赖 - 依赖图
选择最低的兼容版本,课堂举的例子感觉不太符合
2.3.6 依赖分发 - 回源-proxy
github svn等,主要是关注如何得依赖包
缺点,无法保证构建稳定性
代码托管平台负载压力
利用proxy做中转站,保证稳定可靠,
GOPROXY=“proxy1.cn,https://proxy2.cn,…
proxy1->proxy2->源站
2.3.7 工具 - go get
。。。。。。
2.3.8 工具 - go mod
init 初始化创建go.mod文件
download 把所有依赖拉下来
tidy 增加需要依赖,删除不需要依赖
3.测试
回归测试
集中测试
单元测试
3.1 单元测试
输入测试单元得输出校对期望
3.1.1 单元 - 规则
所有测试文件以 _test.go结尾
命名规范
func TestXxxx(t *testing.T){
}
初始化逻辑放到TestMian中
func TestMain(m *testing.M){
//测试前:数据装置等测试准备工作
code:=m.Run()
//测试后,收尾工作
os.Exit(code)
}
3.1.2 单元测试 - 运行
依赖包assert
assert.Equal(t,expectoutput,output)
3.1.3 单元测试 - 覆盖率
go --cover
检验代码是否经过足够测试,所有代码是否都经过测试过。
一般50%~60%,较高80%以上
3.2 单元测试 - 依赖
外部依赖=>稳定&幂
3.3 单元测试例子 - 文件管理
测试文件可能被删改
3.4 单元测试 -mook
快速mock函数
打桩:替换
为一个函数打桩
为一个方法打桩
func Patch(target,replacement interface{})//打桩
func Unpatch(target interface{})//删除桩
实质:运行时替换函数地址
3.5 基准测试
3.5.1 基准测试 -例子
随机选择执行服务器,
3.5.2 基准测试 - 运行
Benchmark为开头 进行基准测试
3.5.3 基准测试 - 优化
函数前加Fast FastSelect()
4.项目实践
4.1 需求描述
4.2 需求用例
Topic PostList
4.3 ER 图
关系,属性
4.4 分层结构
数据层 repository:
数据model 外部数据增删查改
逻辑层 service :
业务Entity,处理核心业务输出
视图层 controller :
包装一些数据结构,视图view,、
4.5 组件工具
gin 高性能go web 框架
go mod
4.6大项目源码更新
。。。。待续未完