go example函数必须以example开头,而非test;它用于文档生成,需满足无参数无返回值、末尾// output:注释及逐行匹配的标准输出等严格格式要求。

Go Example函数必须以Test开头还是Example开头?
Go的Example函数必须以Example为前缀,不是Test——后者是单元测试函数,会被go test执行;而Example函数仅用于文档生成和交互式验证,运行需用go test -run=^$ -examples或go doc查看。
常见错误是把Example写成func TestMyFuncExample(),结果go test -v里看不到它,go doc也查不到示例输出。
-
Example函数名后可接驼峰标识(如ExampleParseURL),用于关联对应函数,但非强制 - 函数必须无参数、无返回值,否则
go test -examples会直接忽略 - 最后一行必须是
// Output:注释,其后紧跟期望输出(空行也算输出的一部分)
Example函数里怎么打印才能被正确捕获输出?
Go只捕获fmt.Println、fmt.Printf等标准输出到os.Stdout的内容,且要求输出与// Output:下方内容**逐行完全一致**(含空格、换行符)。
容易踩的坑:用log.Println——它输出到os.Stderr,不会被捕获;或用fmt.Print(不换行)导致末尾缺少\n,比对失败。
- 必须用
fmt.Println或fmt.Printf("%v\n", x)确保每行结尾有\n -
// Output:必须独占一行,且紧贴在函数体结束前,不能有空行隔开 - 如果示例中调用了可能panic的代码(如
json.Unmarshal),需显式recover或保证输入安全,否则Example会运行失败,go test -examples报FAIL
func ExampleHello() {
fmt.Println("hello world")
// Output:
// hello world
}
如何让Example同时作为可运行的独立程序?
Go的Example函数本身不能直接go run,因为它没有main入口。但可以复用逻辑:把核心逻辑抽成导出函数,在Example里调用,再额外写一个main.go调用同一函数。
不要在Example里写func main()——这会导致go test解析失败;也不要复制粘贴逻辑,维护成本高。
- 将示例逻辑封装为
DoSomething()(首字母大写,导出) - Example函数只负责调用+输出,保持简洁
- 新建
cmd/example/main.go,import包后调用同一函数,这样既可go run cmd/example,又不影响Example测试 - 若想一键运行所有Example,可用
go run -tags example ./...配合构建tag(需在Example文件顶部加//go:build example)
Example和_test.go里的Test函数怎么协同写文档?
Example展示“怎么用”,Test验证“是否正确”,二者互补但职责分明。一个典型流程是:先写Test保证行为正确,再写Example展示典型用法,最后用go test -examples确认输出稳定。
容易被忽略的是:Example的输出文本一旦写死,就变成契约——后续修改函数行为时,必须同步更新// Output:,否则go test -examples会失败,CI可能卡住。
- 避免在Example里写复杂初始化(如打开文件、启动HTTP server),它不是集成测试
- 如果函数返回error,Example中应处理并打印,比如
if err != nil { fmt.Printf("error: %v\n", err) } - 多个Example覆盖不同场景时(如正常路径/错误路径),每个都需独立
// Output:,且不能共用变量名引发作用域冲突
最麻烦的其实是空格和换行——多一个空格、少一个回车,Example就挂。每次改完函数逻辑,别忘了重新跑一遍go test -examples。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











