0

0

Go测试与示例代码有什么区别_Go Example用法解析

P粉602998670

P粉602998670

发布时间:2026-01-12 16:03:02

|

450人浏览过

|

来源于php中文网

原创

Go测试函数名必须以Test开头,Example函数名必须以Example开头;Test函数接收testing.T或testing.B,用于断言和性能测试,而Example函数仅可选接收*testing.T,用于文档示例与输出校验,需严格匹配// Output:注释。

go测试与示例代码有什么区别_go example用法解析

Go测试函数名必须以Test开头,Example函数名必须以Example开头

这是最直接的区分点。Go的go test命令只识别func TestXxx(*testing.T)格式的测试函数;而示例代码(Example)是用于生成文档和验证可运行性的特殊函数,必须命名为ExampleXxx,且参数和返回值有严格限制——只能无参或仅接收*testing.T,不能有其他参数,也不能返回值。

常见错误是把示例写成func ExampleFoo() { ... }却忘了导出首字母大写,或者误加error返回值导致go test直接忽略该函数。

  • Test函数:必须接收*testing.T*testing.B,用于断言、性能基准等
  • Example函数:可选接收*testing.T(用于失败时标记示例失效),但不支持*testing.B
  • 未导出的example函数(如exampleHelper())不会被go docgo test -run=Example识别

Example函数会被go doc提取为文档示例,且自动验证是否能编译+运行

当你运行go doc fmt.Print,看到的“Example”区块就来自源码中名为ExamplePrint的函数。Go工具链在生成文档时会解析这些函数,并在go test中用-run=Example单独执行它们——不仅检查是否编译通过,还会比对函数末尾的// Output:注释与实际标准输出是否完全一致(包括空格和换行)。

这意味着:Example既是文档,也是测试,但约束更强:输出必须可预测、不可含随机值(如time.Now())、不可依赖外部状态。

  • 必须在函数末尾添加// Output:注释,否则go test -run=Example会报错missing output comment
  • 输出内容需字面量匹配,例如fmt.Println("hello")对应// Output: hello(注意末尾换行)
  • 若使用t.Logt.Error,不会影响// Output:校验,但会影响示例是否“通过”
func ExampleParseInt() {
	n, err := strconv.ParseInt("42", 10, 64)
	if err != nil {
		panic(err)
	}
	fmt.Println(n)
	// Output: 42
}

Example不能像Test那样使用t.Helper()或子测试t.Run()

*testing.TExample中功能受限。虽然可以传入并调用t.Fatalt.Log,但t.Helper()t.Run()t.Cleanup()等方法在Example上下文中不生效,调用会 panic 或静默失败。

PaperAiBye
PaperAiBye

支持近30多种语言降ai降重,并且支持多种语言免费测句子的ai率,支持英文aigc报告等

下载

根本原因是Example不是为“组织测试逻辑”设计的,而是为“展示典型用法 + 验证输出”服务的。它没有测试生命周期管理需求,也不支持并发子示例。

  • 不要在Example里写多个场景——应拆成ExampleXxx_BasicExampleXxx_ErrorCase等独立函数
  • 避免在Example中做资源清理(如os.Remove),因为失败时无法保证执行
  • 若需复用逻辑,用普通未导出函数(如parseAndPrint()),但确保它不依赖t或产生非确定输出

go test -run=Example只运行Example函数,但默认不运行

很多人以为go test会自动跑Example,其实不会——除非显式指定-run=Example或使用-run='^Example.*$'。这也是容易忽略的关键点:Example代码可能长期没被执行,直到某次文档生成或手动验证才发现已失效。

CI中若想保障示例始终有效,必须在测试命令中加入go test -run=Example ./...。另外,go test -v -run=Example会显示每个Example的输出对比结果,便于调试不匹配问题。

  • go test 默认只运行Test函数
  • go test -run=Example 只运行Example函数(当前包)
  • go test -run=ExampleXXX 可精确匹配函数名,比如go test -run=ExampleJSONMarshal
Example的真正价值不在“多写一个测试”,而在于让文档自带可验证性。一旦// Output:和代码脱节,go doc展示的就是过期示例——这种问题往往在线上被用户第一个发现。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.09.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号