这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
由于已经具有一定Go语言基础,因此不会详细介绍一些冗余内容,仅记录个人新学习到的一些知识点: Go语言进阶知识点以及代码测试相关内容
二、详细知识点介绍:
- 协程
Go语言在并发编程方面的强大能力离不开Go语言自身所提供的Goroutine。Go 语言的调度器通过使用与 CPU 数量相等的线程减少线程频繁切换的内存开销,同时在每一个线程上执行额外开销更低的 Goroutine 来降低操作系统和硬件的负载,大约能减少80%左右的开销。
- Channel
Channel 是 Go 语言中Goroutine 之间的通信方式,通过Channel可以实现多协程之间共享内存。
- 单元测试
单元测试是检查我们的代码能否按照预期执行,检查代码逻辑是否有问题的必经流程,为项目的鲁棒性提供保证。Go语言本身对自动化测试非常友好,自身提供了testing包,并且有许多优秀的测试框架支持,例如testify等。
假设我们需要编写demo.go的测试文件,需要创建一个名称为demo_test.go文件(必须以_test.go结尾),该文件包含 TestXxx 函数(Xxx为被测试的函数名称),举个例子:
my_proj
--demo.go
--demo_test.go
假设demo.go中包含的代码为:
func Add(a, b int) int {
return a + b
}
将测试文件demo_test.go文件放在与被测试文件相同的包中,该文件不会影响这个包的正常运行,但在运行 go test 命令时将会被包含进去。测试函数的形参必须接受一个指向 testing.T 类型的指针,并且不能返回任何值,例如:
func TestAdd(t *testing.T) {
sum := Add(2, 3)
if sum == 5 {
t.Log("PASS")
} else {
t.Fatal("WRONG")
}
}
在my_proj目录下执行test得到测试结果:
go test -v
=== RUN TestAdd
demo_test.go:16: PASS
--- PASS: TestAdd (0.00s)
PASS
ok my_proj 0.467s
显示PASS说明该项测试通过,返回的值与我们预期的值是相同的。现在尝试把预期结果修改一下:
func TestAdd(t *testing.T) {
sum := Add(2, 3)
if sum == 7 {
t.Log("PASS")
} else {
t.Fatal("WRONG")
}
}
得到测试结果:
go test -v
=== RUN TestAdd
demo_test.go:18: WRONG
--- FAIL: TestAdd (0.00s)
FAIL
exit status 1
FAIL my_proj 0.339s
此时提示测试不通过,得到的值与预期的值不相同。
三、课后个人总结:
- 利用单元测试,能够快速熟悉项目,并且发现原有代码中可能存在的一些需要改进的地方。
五、引用参考: