
go 的示例函数(example*)默认需带 // output: 注释才能被 go test 执行;若省略该注释,仅编译不运行。本文介绍一种简洁可靠的方法:通过普通测试函数显式调用 example 函数,并结合 -v 和 -run 参数实现可控执行与输出查看。
go 的示例函数(example*)默认需带 // output: 注释才能被 go test 执行;若省略该注释,仅编译不运行。本文介绍一种简洁可靠的方法:通过普通测试函数显式调用 example 函数,并结合 -v 和 -run 参数实现可控执行与输出查看。
在 Go 文档规范中,Example* 函数主要用于生成可运行、可验证的文档示例。当函数末尾包含 // Output: ... 注释时,go test 会自动编译并执行该函数,同时比对实际输出与注释中声明的期望输出——这使其兼具文档性与测试性。但许多真实场景下的示例(如涉及网络请求、交互式输入、耗时操作或副作用)无法安全纳入自动化测试流程,此时开发者常主动省略 // Output: 注释,仅保留示例代码以供阅读和手动验证。
然而,“不运行”不等于“不可运行”。Go 的测试机制本身并不禁止调用 Example* 函数——它们只是普通导出函数(位于 _test.go 文件中,且符合 func ExampleXxx() 签名)。因此,最直接、标准且无需引入第三方工具的方案是:在同一个测试文件中,编写一个常规 Test* 函数来显式调用目标 Example* 函数,并配合 testing.Verbose() 控制执行时机,避免干扰常规测试流程。
以下是一个典型实践示例:
// stringutil/example_test.go
package stringutil
import "fmt"
// ExampleReverse 演示字符串反转(无 Output 注释,仅作演示)
func ExampleReverse() {
fmt.Println(Reverse("hello"))
fmt.Println(Reverse("Go"))
}
// TestExampleReverse 用于手动运行 ExampleReverse,仅在 -v 模式下触发
func TestExampleReverse(t *testing.T) {
if !t.Verbose() {
t.Log("Tip: run with -v to see example output")
return
}
ExampleReverse()
}
✅ 运行方式灵活可控:
- 查看单个示例输出:
go test -v -run TestExampleReverse
- 仅编译一次,多次快速执行(适合调试):
go test -c -o stringutil.test ./stringutil.test -test.run TestExampleReverse -test.v
- 运行所有带 -v 的示例测试(需统一命名约定):
go test -v -run "^TestExample"
⚠️ 注意事项:
- Example* 函数必须定义在 _test.go 文件中,且包名与被测包一致(通常为 package stringutil 而非 package stringutil_test),否则可能因作用域问题导致调用失败;
- 不建议在 Test* 中对 Example* 做断言或错误处理——其核心价值在于“演示行为”,而非“验证逻辑”;若需验证,请改用标准 Test* 函数;
- 文档生成(godoc / go doc)仍会正确识别并渲染原始 ExampleReverse 函数及其注释,本方法不影响文档质量。
综上,该方案完全基于 Go 原生工具链,零依赖、高兼容、语义清晰:它既尊重了 Go 示例的文档定位,又赋予开发者按需执行的灵活性,是处理无输出注释示例的最佳实践。











