Go Example函数必须以Example开头、无参数无返回值,定义在同包的_test.go文件中,末尾需有顶格// Output:注释并精确匹配fmt.Println输出。

Go Example 函数必须以 Example 开头且无参数无返回值
Go 的测试框架会自动识别以 Example 为前缀、不带参数和返回值的函数作为文档示例。它不是普通测试,不走 go test 默认执行流,而是由 go test -run=^$ -example=. 或 go doc 触发。
常见错误是加了参数(比如 func ExampleFoo(s string))或写了 return,这会导致 go test -example=. 完全忽略该函数,也不报错——静默失效。
-
Example后紧跟的标识符需与被说明的导出对象(函数/类型/变量)名一致,如ExamplePrintln对应fmt.Println - 若想为类型
Config写示例,函数名应为ExampleConfig,而非ExampleNewConfig - 函数体末尾建议用
// Output:注释块标明预期输出,否则go test -example=.不校验结果
如何让 Example 函数真正运行并验证输出
默认 go test 不执行 Example 函数,必须显式启用。最常用的是:
go test -run=^$ -example=.
其中 -run=^$ 排除所有普通测试(避免干扰),-example=. 匹配全部 Example 函数。如果只想跑某个,比如 ExampleParseInt,就写 -example=ParseInt。
立即学习“go语言免费学习笔记(深入)”;
注意:// Output: 后的内容必须与实际 stdout 完全一致(包括空行、缩进、换行符),否则报 Output does not match。例如:
func ExampleParseInt() {
i, _ := strconv.ParseInt("42", 10, 64)
fmt.Println(i)
// Output:
// 42
}
这里末尾的 42 前不能有多余空格,也不能少换行。
Example 函数里不能调用 t.Log/t.Error,但可 panic
Example 函数签名固定为 func ExampleXXX(),没有 *testing.T 参数,因此不能用 t.Log 打印调试信息,也不能用 t.Fatal 中断。任何对 t 的引用都会编译失败。
但可以主动 panic("xxx") 来模拟错误路径,只要最终输出匹配 // Output: 即可。不过更推荐用条件分支+注释说明异常情况,例如:
func ExampleParseInt_error() {
_, err := strconv.ParseInt("not-a-number", 10, 64)
if err != nil {
fmt.Println("error occurred")
}
// Output:
// error occurred
}
Example 函数的可见性与包路径依赖
Example 函数必须定义在要说明的对象所在的同一个包中,且自身必须是导出的(首字母大写)。如果包是 github.com/user/lib,Example 函数就得放在该包的源码里,不能放在外部调用方代码中。
跨包引用时要注意:若 Example 函数里用了其他包的符号(如 json.Marshal),必须确保该包已导入;但不要为了写 Example 而在主逻辑中添加非必要 import——Example 文件可独立存在,Go 允许仅在 _test.go 文件里导入额外依赖。
容易忽略的一点:如果 Example 函数位于 xxx_test.go 文件中,它只能说明同目录下同一包的导出项;若想说明 subpkg.Foo,Example 函数就得放在 subpkg 目录内,命名为 ExampleFoo,且文件名仍为 xxx_test.go。


















