Go实战|青训营笔记

42 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

并发和并行的关系:

image.png

image.png go提倡利用通信共享内存实现通信

channel通道,并发安全的

make(chan 元素,【缓冲大小】)
无缓冲通道 make(chan,int)
有缓冲通道 make(chan,int,2)
go语言单元测试

基本分类 测试函数 函数前缀为Test 主要用于测试程序的一些逻辑行为是否正确 基准函数 函数名前缀为Benchmark 主要测试函数的性能 示例函数 函数的前缀名为 Example 为文档提示示例文档 2.细说单元测试分类 ①测试函数 函数的基本测试 函数的组测试 函数的子测试 测试函数覆盖率(也就是被测试函数有多少代码用于了执行) 在进行测试的时候,要保证被测函数覆盖率为100%,测试函数覆盖率为60%以上,否则写的代码大部分用不到,需要优化 ①测试覆盖率可以使用go test -cover ②go test -cover -coverprofile=c.out(将测试的结果存入文件c.out) 然后使用go tool cover -html=c.out可以打开文件,显示哪些代码没有执行 ②基准测试 基准函数测试是做什么的:基准函数会自定义一个时间段用于执行代码,如果代码简洁,被测函数的执行次数需要成倍增加(直到达到基准测试函数给的预期,然后统计一共执行了多少轮,,每轮平均用时多少) 执行基准函数时,首先要写基准函数 基准测试函数的参数是:*testing.B对应的指针变量 在测试函数内部要进行循环,循环的终止条件是b.N ③示例函数 二、结合代码细说每一种测试

	进行基准测试时往往是对函数的算法进行测验,有时后一个算法在测试数据的基量不同时测试出的效果会不同
	我们需要对不同数量级的样本进行测试的时候。可以自己写一个盒子作为跳板,测试什么数量级的数据就只
	进行当前数量级的测试
	测试的时候命令为:go test -bench=.(将所有的跳板函数均执行一遍)
					或者=特定函数进行特定函数测试
					-benchtime=time 
					(在被测试函数在基准函数默认的时间内执行不完时可以拿这个参数进行时间的扩充)
	在进行基准函数测试的时候,可能需要进行一些前置工作,如果感觉前置工作浪费时间可以使用
	b.ResetTimer()对计时器进行重置

基准代码:

//文件名 subStr_test.go
package main

import (
	"reflect"
	"testing"
)
func BenchmarkSubStr(b *testing.B) {
	for i := 0; i < b.N; i++ {
		res := subStr("qwe:qw:es:wqe", ":")
		if !reflect.DeepEqual(res, []string{"qwe", "qw", "es", "wqe"}) {
			b.Errorf("不匹配")
		}
	}

}

func benchmarkFib(b *testing.B, n int) {
	for i := 0; i < b.N; i++ {
		Fib(n)
	}
}

func BenchmarkFib5(b *testing.B)  { benchmarkFib(b, 5) }
func BenchmarkFib10(b *testing.B) { benchmarkFib(b, 10) }
func BenchmarkFib15(b *testing.B) { benchmarkFib(b, 15) }
func BenchmarkFib20(b *testing.B) { benchmarkFib(b, 20) }

被测代码:

//文件名 subStr.go
package main

import (
	"fmt"
	"strings"
)

func subStr(str, stre string) []string {
	index := strings.Index(str, stre)
	var theSub []string

	for index >= 0 {
		// 先将分隔符前面的数据进行保存
		temp := str[:index]
		// 将字符串往后移
		str = str[index+1:]
		// 重新获取下标
		index = strings.Index(str, stre)
		if temp != "" {
			theSub = append(theSub, temp)
		} else {
			continue
		}
	}
	theSub = append(theSub, str)
	return theSub[:]
}

// 菲薄那契数列
func Fib(n int) int {
	if n < 2 {
		return n
	}
	return Fib(n-1) + Fib(n-2)
}

func main() {
	fmt.Println(subStr("q:w:ec:wer:cd:scn:cj:c:is:icc:cin:si", ":"))
	fmt.Printf("%#v\n", subStr("q:w:ec:wer:cd:scn:cj:c:is:icc:cin:si", ":"))
	fmt.Println(123)
}
将以上两个文件放在同一目录下
执行测试命令 go test
得到测试结果
goos: windows
goarch: amd64
cpu: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
BenchmarkSubStr-8   1213681	   1012 ns/op	  352 B/op  14 allocs/op
PASS
ok  	_/d_/Go语言学习笔记/go语言语法部分/go语言进阶语法/8.单元测试/基准测试	2.410s

func (b *B) RunParallel(body func(*PB))会以并行的方式执行给定的基准测试。

RunParallel会创建出多个goroutine,并将b.N分配给这些goroutine执行, 其中goroutine数量的默认值为GOMAXPROCS。用户如果想要增加非CPU受限(non-CPU-bound)基准测试的并行性, 那么可以在RunParallel之前调用SetParallelism 。RunParallel通常会与-cpu标志一同使用。