lesson2|青训营笔记

62 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第3天,本篇文章发的是字节跳动青训营第二天的课程,昨天消化完视频已经很晚了,所以选择今天发。今天的学习分为两个部分

Go语言进阶与依赖管理

第一部分其实和操作系统这门专业课有很大关系。

并发、并行、Goroutine

Go语言的运行是非常快的,他可以并行运行(操作系统中概念),而通俗的说并行可以让各个任务同时在每个cpu运行(多核CPU)。

goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时管理。go语言会开启一个协程,处理相应的事务并会智能地将 goroutine 中的任务合理地分配给每个 CPU。

CSP、Channel

为了加快资源的调度,Go语言使用通信共享内存来实现通信。

协程之间通信的渠道通过make创建分为有无缓冲区通道两种。

image.png

第一种不带缓冲区,第二种使用了缓冲区。

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.为一个方法打桩

项目实战

理解能力有限,只能过一遍视频粗浅理解,后面希望能尽快补上。