错误处理
什么是error?
error是go内建的一个接口,实现方法为Error() string,可看做基本类型之一
panic()的功能是什么?
- 立即停止当前函数运行;
- 向上返回,执行defer;
- 没遇到recover则程序直接退出;
recover的功能是什么?
接收panic的信息并做处理,防止panic直接将程序中断,例如开启server时,并不希望server因为某个错误而挂掉,一般都有对应的recover()来处理panic。
什么时候用error/panic?
常见的都用error,意料之外的用panic
testing基本语法
go的测试文件名有何规定?
测试名为 _test.go(为通配符)
如何运行测试文件?
- 测试当前目录下的所有文件:go test
测试目录下某个单独的文件:go test -file *.go
go测试的基本方式
传统测试是什么样的?
测试数据和测试逻辑(函数调用)耦合;
- 测试错误信息不明确,比如下图只输出错误信息,不知道错误具体位置;
- 一旦一个数据错误,测试全部结束;
表格驱动测试
什么是表格驱动测试?
- 将数据组织成“表格”的形式,降低测试数据和测试逻辑之间的耦合性;
- 明确出错信息;
- 可以部分失败;
Go对表格驱动测试的优势体现在哪?
Go语法对数据“表格”的定义十分简单明了。
测试覆盖率
命令行输出测试覆盖率:go test -coverprofile=c.out
html格式可视化:go tool cover -html=c.out
性能测试
go test -bench . // 测试当前目录下所有文件的bench
使用pprof进行性能调优
- 生成bench的cpu数据文件cpu.out:go test -bench cpuprofile cpu.out
- 使用pprof进入cpu.out文件:go tool pprof cpu.out
- 在pprof的交互命令中输入web,输出一个.svg可视化文件来查看程序各个部分的耗时情况
- 针对耗时长的部分进行调优
生成测试文档和示例代码
使用 godoc -http :6060 命令在本地6060端口中可看见go文档,包括自己写的。各类方法的注释都会被描述为文档的一部分.
代码:
package queue
// An FIFO queue.
type Queue []int
// Pushes the element into the queue.
func (q *Queue) Push(v int) {
*q = append(*q, v)
}
// Pops element from head.
func (q *Queue) Pop() int {
head := (*q)[0]
*q = (*q)[1:]
return head
}
// Returns if the queue is empty or not.
func (q *Queue) IsEmpty() bool {
return len(*q) == 0
}
对应的文档:
如何写示例代码?
在xxx_test.go下,写一个ExampleName_Funcname的方法,在注释中写output,注意output一定要正确。
func ExampleQueue_Pop() {
q := Queue{1}
q.Push(2)
q.Push(3)
fmt.Println(q.Pop())
fmt.Println(q.Pop())
fmt.Println(q.IsEmpty())
fmt.Println(q.Pop())
fmt.Println(q.IsEmpty())
// Output:
// 1
// 2
// false
// 3
// true
}
则在文档中可看到: