发布于2026-07-10 阅读(0)
扫一扫,手机访问
先说说Go语言里一个特别容易踩坑的点——Example测试函数。很多人在写测试的时候顺带写一个Example函数,想当文档用,结果写完发现go test根本不执行它,找半天原因,最后发现要么是函数名写错了,要么是少了一行关键的注释。这种问题编译器不会报错,所以更隐蔽,也更让人头疼。
Go 不会报错,也不会提示,只是静默跳过——你写的 exampleFoo、Example_foo、ExampleFoo_test 或 ExampleFoo() 带参数,全都不被识别。
必须严格满足:首字母大写 Example + 驼峰标识符(如 ParseInt、HTTPClient),中间不能有下划线,结尾不能带 _ 或 _test。
ExampleParseInt ✅exampleParseInt ❌(小写开头)Example_ParseInt ❌(下划线后接大写也不行)ExampleParseInt(t *testing.T) ❌(带参数)// Output: 就等于没写函数能编译,但 go test -example=. 或 go test -v 完全不执行它——不是失败,是直接忽略。
// Output: 不是注释,是测试断言标记。它必须:
fmt.Println 实际打印的**逐字符一致**(含换行、空格、制表符)比如 fmt.Println("hello") 输出的是 hellon,那么 // Output: 后面就得是 hello(go test 会自动忽略末尾换行),多一个空格或少一个换行都会报 output mismatch。
xxx_test如果你的包叫 jsonutil,源码是 package jsonutil,那 ExampleMarshal 就必须定义在 package jsonutil 的 _test.go 文件里,而不是 package jsonutil_test。
放在 jsonutil_test 包里,go doc 找不到,go test 也不执行——它只认“同包 + 同文件作用域”的 Example。
jsonutil_example_test.go,开头写 package jsonutilgo test example_test.go 单文件运行,会进 command-line-arguments 模式,Example 失效;要进包目录,执行 go test -v 或 go test -example=.Go 的 map 迭代顺序随机,time.Now() 每次不同,fmt.Printf("%p", &x) 地址每次变——这些会让 // Output: 断言必然失败。
解决办法不是“关掉验证”,而是让输出可控:
json.Marshal 替代直接打印 map 或 structtime.Unix(123, 0) 而非 time.Now()log.Println、自定义 io.Writer,只用 fmt.Println / fmt.Printffmt.Println,别用 n 拼接——godoc 会把换行转成空格真正麻烦的从来不是语法,而是你以为“输出看着一样”就万事大吉;go test 比对的是字节流,空格、换行、大小写,一个都不能错。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8