错误处理

什么是error?
error是go内建的一个接口,实现方法为Error() string,可看做基本类型之一

panic()的功能是什么?

  1. 立即停止当前函数运行;
  2. 向上返回,执行defer;
  3. 没遇到recover则程序直接退出;

recover的功能是什么?
接收panic的信息并做处理,防止panic直接将程序中断,例如开启server时,并不希望server因为某个错误而挂掉,一般都有对应的recover()来处理panic。

什么时候用error/panic?
常见的都用error,意料之外的用panic

testing基本语法

go的测试文件名有何规定?
测试名为 _test.go(为通配符)

如何运行测试文件?

  1. 测试当前目录下的所有文件:go test
  2. 测试目录下某个单独的文件:go test -file *.go

    go测试的基本方式

    传统测试是什么样的?

  3. 测试数据和测试逻辑(函数调用)耦合;

  4. 测试错误信息不明确,比如下图只输出错误信息,不知道错误具体位置;
  5. 一旦一个数据错误,测试全部结束;

image.png

表格驱动测试

什么是表格驱动测试?

  1. 将数据组织成“表格”的形式,降低测试数据和测试逻辑之间的耦合性;
  2. 明确出错信息;
  3. 可以部分失败;

image.png

Go对表格驱动测试的优势体现在哪?
Go语法对数据“表格”的定义十分简单明了。

测试覆盖率

命令行输出测试覆盖率:go test -coverprofile=c.out
html格式可视化:go tool cover -html=c.out

性能测试

go test -bench . // 测试当前目录下所有文件的bench

使用pprof进行性能调优

  1. 生成bench的cpu数据文件cpu.out:go test -bench cpuprofile cpu.out
  2. 使用pprof进入cpu.out文件:go tool pprof cpu.out
  3. 在pprof的交互命令中输入web,输出一个.svg可视化文件来查看程序各个部分的耗时情况
  4. 针对耗时长的部分进行调优

生成测试文档和示例代码

使用 godoc -http :6060 命令在本地6060端口中可看见go文档,包括自己写的。各类方法的注释都会被描述为文档的一部分.

代码:

  1. package queue
  2. // An FIFO queue.
  3. type Queue []int
  4. // Pushes the element into the queue.
  5. func (q *Queue) Push(v int) {
  6. *q = append(*q, v)
  7. }
  8. // Pops element from head.
  9. func (q *Queue) Pop() int {
  10. head := (*q)[0]
  11. *q = (*q)[1:]
  12. return head
  13. }
  14. // Returns if the queue is empty or not.
  15. func (q *Queue) IsEmpty() bool {
  16. return len(*q) == 0
  17. }

对应的文档:
image.png

如何写示例代码?
在xxx_test.go下,写一个ExampleName_Funcname的方法,在注释中写output,注意output一定要正确。

  1. func ExampleQueue_Pop() {
  2. q := Queue{1}
  3. q.Push(2)
  4. q.Push(3)
  5. fmt.Println(q.Pop())
  6. fmt.Println(q.Pop())
  7. fmt.Println(q.IsEmpty())
  8. fmt.Println(q.Pop())
  9. fmt.Println(q.IsEmpty())
  10. // Output:
  11. // 1
  12. // 2
  13. // false
  14. // 3
  15. // true
  16. }

则在文档中可看到:
image.png

参考资料

  1. 慕课网-ccmouse