Go-知识测试-示例测试
示例测试要保证测试文件以_test.go结尾。测试方法必须以ExampleXxx开头。测试文件可以与源码处于同一目录,也可以处于单独的目录。检测单行输出格式为 // Output: 检测多行输出格式为 // Output: \n \n \n,每个期望字符串占一行检测无序输出格式为 // Unordered output: \n \n \n ,每个期望字符串占一行。_go 测试类
示例测试要保证测试文件以_test.go结尾。测试方法必须以ExampleXxx开头。测试文件可以与源码处于同一目录,也可以处于单独的目录。检测单行输出格式为 // Output: 检测多行输出格式为 // Output: \n \n \n,每个期望字符串占一行检测无序输出格式为 // Unordered output: \n \n \n ,每个期望字符串占一行。_go 测试类
性能测试会执行多次,然后计算平均耗时。性能测试要保证测试文件以_test.go结尾。测试方法必须以开头。测试文件可以与源码处于同一目录,也可以处于单独的目录。_go 性能测试
声明一个,名字比较特殊的测试,参数类型为test.M指针。如果声明了一个这样的测试,那么当前测试程序不是直接执行各项测试,而是将测试交给TestMain调度。_go testmain
单元测试是指对软件中的最小可测试单元进行检查和验证,比如对一个函数的测试。单元测试要保证测试文件以_test.go结尾。测试方法必须以TestXxx开头。测试文件可以与源码处于同一目录,也可以处于单独的目录。_go 单元测试
在 Go 语言的源码中,go test 命令的实现主要在 src/cmd/go/internal/test 包中。当你运行 go test 命令时,Go 的命令行工具会调用这个包中的代码来执行测试。在 src/cmd/go/internal/test 包中,runTest 函数是 go test 命令的主要入口点。这个函数负责解析命令行参数,构建测试的二进制文件,启动这个二进制文件,以及读取和解析测试结果。_go test
在Java或者c/c++中,实现接口需要使用特定的关键字,声明实现的接口。 在Go里面有一个鸭子类型的思想: "鸭子类型"(Duck Typing)是一种编程概念,它的名字来源于英语中的一句谚语: "如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子"。
互斥锁 Mutex 是串行加锁,拿到锁之后,不管是读操作还是写操作,对于 Mutex 来说,是等价的。但是在并发里面,如果仅仅是读操作,不改变数据的前提下,是可以共享的,多个协程读取到的数据都是可信的。写锁需要阻塞写锁: 一个协程拥有写锁时,其他协程写操作需要阻塞写锁需要阻塞读锁: 一个协程拥有写锁时,其他协程读操作需要阻塞读锁需要阻塞写锁: 一个协程拥有读锁时,其他协程写操作需要阻塞读锁不能阻塞读锁: 一个协程拥有读锁时,其他协程读操作不需要阻塞。_go rwmutex
互斥锁是并发程序中对共享资源进行访问控制的主要手段,Go 语言提供了非常简单易用的 Mutex。Mutex 是结构体类型,对外暴露了 Lock 和 Unlock 两个方法,用于加锁和解锁。自旋对应于CPU的PAUSE指令,CPU对该指令什么都不做,相当于CPU空转,对程序而言相当于sleep了一小段时间,时间非常短,当前实现是 30个时钟周期。自旋过程中会持续探测 Locked 是否变为0 ,连续两次探测奸恶就是在执行这些 PAUSE 指令,不同于sleep,不需要将协程转为睡眠状态。_go mutex
Go 语言的 context 是应用开发常用的并发控制技术,它与 WaitGroup 最大的不同点是 context对于派生 goroutine 有更强的控制力,可以控制多级的 goroutine。context 翻译成中文是 上下文 ,即可以控制一组呈树状结构的 goroutine ,每个 goroutine 拥有相同的上下文。上图中由于 goroutine 派生出子 goroutine ,而子 goroutine 又继续派生出新的 goroutine ,_go并发 context
WaitGroup 通常用于等待一组“工作协程”结束的场景,其内部维护两个计数器,可以称为“工作协程”计数器和“等待协程”计数器。Add(delta int) 方法用于增加“工作协程”计数,通常在启动新的“工作协程”之前调用。Done 方法用于减少“工作协程”计数,每次调用递减1,通常在“工作协程”内部且在临近返回之前调用。Wait 方法用于增加“等待协程”计数,通常在所有“工作协程”全部启动之后调用。_go waitgroup