Go-知识泛型
除了内置的comparable和any两种类型可作为类型约束使用,用户还可以使用interface来定义类型集合。任意类型元素(如 int)近似类型元素(使用表示法,如int)联合类型元素(使用|表示法,如int|int64)需要注意的是,如果interface类型中使用了这三种元素的任意一种,那么这个interface只能用于泛型的类型参数反形式衡量编程语言技术完备度的一个重要参考指标,但是也是一个比较争议的技术。_go泛型
除了内置的comparable和any两种类型可作为类型约束使用,用户还可以使用interface来定义类型集合。任意类型元素(如 int)近似类型元素(使用表示法,如int)联合类型元素(使用|表示法,如int|int64)需要注意的是,如果interface类型中使用了这三种元素的任意一种,那么这个interface只能用于泛型的类型参数反形式衡量编程语言技术完备度的一个重要参考指标,但是也是一个比较争议的技术。_go泛型
Timer是一种单一事件的定时器,即经过指定的时间后触发一个事件,这个事件通过其本身提供的channel进行通知。Timer只执行一次就结束。通过timer.NewTimer(d Duration)可以创建一个Timer,参数即等待时间,时间到来后立即触发一个事件。在中定义了Timer的数据结构Timer对外仅暴露一个channel,指定的时间到来时就往该channel种写入系统时间,即一个事件。_go 定时器
内置函数recover用于消除panic并使程序恢复正常。recover的返回值是什么?执行recover之后程序将从哪里继续运行?recover为什么一定要在defer中使用?与panic函数一样,recover函数也是一个内置函数recover函数的返回值就是panic函数的参数,当程序产生panic时,recover函数就可用于消除panic,同时返回panic函数的参数,如果程序没有发生panic,则recover函数返回nil._go recover
Go 语言开发中程序出现错误,比较常见的是返回error给调用者,但是对于危险的操作,比如内存越界访问等,程序会触发panic,提前结束程序运行。同样是退出程序,与os.Exit相比,panic的退出方式比较优雅,panic会做一定的善后操作(处理defer函数),并且支持使用recover消除panic。defer,panic和recover经常会相互作用。panic触发异常,如果函数没有处理异常,则异常将沿函数调用链逐层向上传递,最终导致程序退出。_go panic
defer 语句用于延迟函数的调用,常用于关闭文件描述符、释放锁等资源释放场景。defer 语句采用后进先出的设计,类似于栈的方式,函数执行时,每遇到一个defer都会把一个函数压入栈中,函数返回前在将函数从栈中取出执行,最早被压入栈中的函数最晚被执行。不仅函数正常返回会执行被defer延迟的函数,函数中任意一个return语句、panic语句均会触发延迟函数。defer 定义的延迟函数参数在defer语句出现时就已经确定了defer 定义的顺序与实际的执行顺序相反。_go defer
error 只是一个内建接口,只要实现了接口,就是 error类型的变量。创建通过 errors.New 和 fmt.Errorf 创建,区别在于是否格式化字符串。Go sdk 实现了errorString 和 wrapError 内部类型。Go 1.13 针对 error 的优化主要是解决了 error 传递时丢失原 error 信息的问题,通过扩展 fmt.Errorf来支持创建链式的 error ,并通过 errors.Unwrap 拆解获得原始 error。_fmt.errorf
p=0.000表示结果的可信程度,p值越大可信程度越低,统计学中通常把p=0.05作为临界值,超过此值说明结果不可信,可能是样本过少等原因。benchstat 是 Go 官方推荐的一款命令行工具,可以针对一组或多组样本进行分析,如果同时分析两组样本,还可以给出性能变化结果。至此,go的测试结束,通过学习go测试,首先是会写各种测试case,其次是理解了各种测试的目的,最后则是学习了很多优秀的实现。自动计算出了平均值,在cpu=10的时候,每次操作2.534微妙,样本离散值(2%)如果没有设置,默认是。_golang benchmark测试结果怎么看
# 1. -args# 2. -json# 3. -o # 4. -bench # 5. -benchtime# 6. -cpu# 7. -count # 8. -failfast# 9. -list# 10. -parallel # 11. -run# 12. -timeout# 13. -v# 14 -benchmem_go test 参数
子测试提供了一种在一个测试函数中执行多个测试的能力,可以自己编排执行顺序,或者做一些初始化等操作。Run 函数启动一个单独的协程来运行名字为name的子测试f,并且会阻塞等待其执行结束,除非子测试f显式调用Parallel将自己编程一个可并行的测试,最后返回bool类型的测试结果。所有的测试,都是由TestMain使用Run方法直接或者间接启动。每启动一个子测试,都会创建一个testing.T或者testing.B变量,该变量集成当前测试的部分属性,然后以新的。_go *testing.t
模糊测试(Fuzzing)是一种通过构造随机数据对代码进行测试的测试方法,相比于单元测试,它能提供更为全面的测试覆盖,从而找出代码中的潜在漏洞。从1.18开始,Go开始正式支持模糊测试。模糊测试要保证测试文件以_test.go结尾。测试方法必须以FuzzXxx开头。模糊测试方法必须以*testing.F作为参数。Go 1.18 的 Fuzz 测试使用了一种称为 “coverage-guided fuzzing” 的技术来生成随机输入。_go 模糊测试