商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Go语言示例函数如何书写_Go语言Example测试函数使用方法【解析】

Go语言示例函数如何书写_Go语言Example测试函数使用方法【解析】

  发布于2026-07-10 阅读(0)

扫一扫,手机访问

先说说Go语言里一个特别容易踩坑的点——Example测试函数。很多人在写测试的时候顺带写一个Example函数,想当文档用,结果写完发现go test根本不执行它,找半天原因,最后发现要么是函数名写错了,要么是少了一行关键的注释。这种问题编译器不会报错,所以更隐蔽,也更让人头疼。

Example函数名写错就彻底失效

Go 不会报错,也不会提示,只是静默跳过——你写的 exampleFooExample_fooExampleFoo_testExampleFoo() 带参数,全都不被识别。

必须严格满足:首字母大写 Example + 驼峰标识符(如 ParseIntHTTPClient),中间不能有下划线,结尾不能带 __test

  • ExampleParseInt
  • exampleParseInt ❌(小写开头)
  • Example_ParseInt ❌(下划线后接大写也不行)
  • ExampleParseInt(t *testing.T) ❌(带参数)

没写 // Output: 就等于没写

函数能编译,但 go test -example=.go test -v 完全不执行它——不是失败,是直接忽略。

// Output: 不是注释,是测试断言标记。它必须:

  • 顶格写(前面不能有空格或缩进)
  • 紧贴函数体最后一行之后(中间不能有空行)
  • 冒号后跟一个空格,再写期望输出
  • 输出内容要和 fmt.Println 实际打印的**逐字符一致**(含换行、空格、制表符)

比如 fmt.Println("hello") 输出的是 hellon,那么 // Output: 后面就得是 hellogo 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 -vgo test -example=.

输出含 map/slice/time 等不可控值时容易翻车

Go 的 map 迭代顺序随机,time.Now() 每次不同,fmt.Printf("%p", &x) 地址每次变——这些会让 // Output: 断言必然失败。

解决办法不是“关掉验证”,而是让输出可控:

  • json.Marshal 替代直接打印 mapstruct
  • 用固定时间点:time.Unix(123, 0) 而非 time.Now()
  • 避免 log.Println、自定义 io.Writer,只用 fmt.Println / fmt.Printf
  • 多行输出?每行单独 fmt.Println,别用 n 拼接——godoc 会把换行转成空格

真正麻烦的从来不是语法,而是你以为“输出看着一样”就万事大吉;go test 比对的是字节流,空格、换行、大小写,一个都不能错。

本文转载于:https://www.php.cn/faq/2796193.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注