这是我参与「第五届青训营 」伴学笔记创作活动的第3天,本篇文章发的是字节跳动青训营第二天的课程,昨天消化完视频已经很晚了,所以选择今天发。今天的学习分为两个部分
Go语言进阶与依赖管理
第一部分其实和操作系统这门专业课有很大关系。
并发、并行、Goroutine
Go语言的运行是非常快的,他可以并行运行(操作系统中概念),而通俗的说并行可以让各个任务同时在每个cpu运行(多核CPU)。
goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时管理。go语言会开启一个协程,处理相应的事务并会智能地将 goroutine 中的任务合理地分配给每个 CPU。
CSP、Channel
为了加快资源的调度,Go语言使用通信共享内存来实现通信。
协程之间通信的渠道通过make创建分为有无缓冲区通道两种。
第一种不带缓冲区,第二种使用了缓冲区。
Lock、WaitGroup
为什么要对缓冲区上锁?(操作系统中PV向量) 携程之间需要完成通信,对同一缓冲区做处理,为了属于安全我们需要对缓冲区进行上锁,代码如下:
lock.lock() //上锁
processs() //处理数据
lock.unlock() //开锁
使用WaitGroup来实现协程的同步和阻塞,如学过操作系统信号量那一小结,则很容易理解之前的内容。
依赖管理
这一章节对以后的实战是有很大帮助的,本人研究生使用的是python,方向是深度学习,在做实验的时候如果各种依赖包版本不一致,代码就很容易运行不了从而需要一点点csdn来重新安装包。
GOPATH和Go Vender都存在一些弊端,现在一般使用Go Module。
1.通过go.mod文件管理依赖包版本。
2.通过go get/go mod指令工具管理依赖包。
依赖管理三要素
a.配置文件,描述依赖---------go.mod
b.中心仓库管理依赖库 --------Proxy
c.本地工具 -----------------go get/mod
Go语言工程实践之测试
测试是项目投入到应用至关重要的一环,目的是检测项目的可行性鲁棒性来减少事故的发生,测试是避免事故的最后一道屏障。
单元测试
单元测试主要包括,输入,测试单元,输出,以及校对,单元的概念比较广,包括接口,函数,模块等;用最后的校对来保证代码的功能与我们的预期相符;单侧一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。另一方面可以提升效率,在代码有bug的情况下,通过编写单测,可以在一个较短周期内定位和修复问题。(来自课程ppt)
测试规则
1.所有测试文件以_test.go结尾。
2.func TestXxx(*testing.T)。
3.初始化逻辑放到TestMain中。
覆盖率
测试是不仅为了保证项目代码的可行性,还要保证项目的鲁棒性,为了避免事故的发生,进行单元测试的代码一定要包含各个方面,
以下代码为例
if score >= 60 {
return true
}
return false
}
我们在测试的时候要保证同时有大于等于60的数字和小于60的数字来参与测试,这样才能保证程序的可行性。
isPass := JudgePassLine(70)
assert.Equal(t, true, isPass)
}
func TestJudgePassLineFail(t *testing.T) {
isPass := JudgePassLine(50)
assert.Equal(t, false, isPass)
}
依赖、Mock
我们的单测需要保证稳定性和幂等性,稳定是指相互隔离,能在任何时间,任何环境,运行测试。 幂等是指每一次测试运行都应该产生与之前一样的结果。而要实现这一目的就要用到mock机制。(来自课程ppt)
快速Mock函数:
1.为一个函数打桩
2.为一个方法打桩
项目实战
理解能力有限,只能过一遍视频粗浅理解,后面希望能尽快补上。