Go语言示例函数如何书写_Go语言Example测试函数使用方法【解析】
Go语言Example测试函数命名必须严格遵循规则:函数名以Example开头,后接驼峰式标识符,不允许下划线且无参数。函数体内必须顶格书写//Output:注释,程序输出的每一行需逐字符完全匹配该注释文本。测试源文件需与被测代码同包,推荐命名风格如jsonutil_example_test.go。应避免使用map、time等不可控输出类型,因其无序性或时间
先说说Go语言里一个特别容易踩坑的点——Example测试函数。很多人在写测试的时候顺带写一个Example函数,想当文档用,结果写完发现go test根本不执行它,找半天原因,最后发现要么是函数名写错了,要么是少了一行关键的注释。这种问题编译器不会报错,所以更隐蔽,也更让人头疼。
Example函数名写错就彻底失效
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。
Example 必须和源码同包,不能放 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 jsonutil - 不要用
go test example_test.go单文件运行,会进command-line-arguments模式,Example 失效;要进包目录,执行go test -v或go test -example=.
输出含 map/slice/time 等不可控值时容易翻车
Go 的 map 迭代顺序随机,time.Now() 每次不同,fmt.Printf("%p", &x) 地址每次变——这些会让 // Output: 断言必然失败。
解决办法不是“关掉验证”,而是让输出可控:
- 用
json.Marshal替代直接打印map或struct - 用固定时间点:
time.Unix(123, 0)而非time.Now() - 避免
log.Println、自定义io.Writer,只用fmt.Println/fmt.Printf - 多行输出?每行单独
fmt.Println,别用n拼接——godoc会把换行转成空格
真正麻烦的从来不是语法,而是你以为“输出看着一样”就万事大吉;go test 比对的是字节流,空格、换行、大小写,一个都不能错。

































