Go 1.27 的 go doc -ex 如何改变示例检索体验
来源:17golang原创
时间:2026-10-13 07:53:23 119浏览 收藏
查 Go API 时,最容易卡住的不是找不到包,而是找到函数签名后仍然不知道“这个 API 应该怎么用”。Go 1.27 给 go doc 增加了 -ex 选项,可以按包或符号列出关联的可执行示例,把文档检索从“看声明”推进到“找用法”。
官方地址:https://go.dev/doc/go1.27
go doc -ex 包名用来列出包级可执行示例,go doc -ex 包名.符号用来缩小到某个 API。- 示例仍然需要遵循
Example命名规则,并放在测试文件中;-ex负责发现,不负责执行。 - 指定一个示例名查询时,Go 1.27 会把该示例的源码和注释一起打印出来,适合继续阅读。
为什么 go doc -ex 适合做示例入口
普通的 go doc 擅长告诉我们一个包有哪些类型、函数和方法,但它给出的重点是 API 形状。真正准备接入代码时,我们还要继续猜示例函数的名字,或者翻到包的 _test.go 文件里搜索。
Go 1.27 的变化是把这一步接到文档命令上:对包使用 -ex 时,可以看到包中的可执行示例;对包和符号一起使用时,可以把范围收窄到某个 API。这里的“可执行”指符合 Go 示例测试约定、能够被测试工具识别的 Example,并不表示命令会替你运行示例。

这对维护者和使用者都很实用:维护者可以用一个可测试的 Example 同时承担文档和回归检查,使用者则可以从 API 名称直接找到更接近真实调用的代码。
先用小包建立可被检索的示例
为了看清检索边界,先准备一个很小的模块。下面的命令只创建实验目录和模块,不依赖第三方包。
# 创建一个独立实验目录,避免修改已有项目 mkdir go-doc-ex-demo cd go-doc-ex-demo # 初始化模块,后续可以用模块路径查询包 go mod init example.com/go-doc-ex-demo # 创建包目录和测试示例文件 mkdir docdemo touch docdemo/normalize.go docdemo/normalize_test.go
在 docdemo/normalize.go 中放一个有明确用途的导出函数,在 docdemo/normalize_test.go 中用 ExampleNormalize 命名示例。示例里的注释解释关键动作,输出注释则描述预期结果。
package docdemo
import "strings"
// Normalize 把连续空白收敛成一个空格,便于展示文本清洗场景。
func Normalize(s string) string {
return strings.Join(strings.Fields(s), " ")
}
package docdemo_test
import (
"fmt"
"example.com/go-doc-ex-demo/docdemo"
)
// ExampleNormalize 展示 Normalize 的输入与可观察结果。
func ExampleNormalize() {
// 使用带有多余空白的输入,突出函数的清洗职责。
input := " go doc -ex "
fmt.Println(docdemo.Normalize(input))
// Output: go doc -ex
}
这里的 ExampleNormalize 同时满足两个目的:名称中的 Normalize 把示例关联到导出函数,Output: 让 go test 能够按示例测试约定检查输出。若只写成普通的 TestNormalize,它仍可能是测试,但不会成为这个文档示例入口。
用 go doc -ex 按包或符号找示例
包文件准备好后,先从包级查询开始。命令的结果重点是“有哪些 Example”,适合刚接触一个新包时建立索引。
# 列出当前模块中 docdemo 包可发现的可执行示例 go doc -ex example.com/go-doc-ex-demo/docdemo # 只关注 Normalize 这个导出符号关联的示例 go doc -ex example.com/go-doc-ex-demo/docdemo.Normalize
如果包里有 ExampleNormalize、ExampleNormalize_trimmed 等示例,符号级查询的价值在于缩小阅读范围。它适合“我已经知道要用哪个 API,但不记得示例叫什么”的场景。
对标准库包也可以使用同样的思路,例如下面的命令把查询目标放在 bytes.Buffer:
# 查询标准库 bytes.Buffer 相关的可执行示例 go doc -ex bytes.Buffer
命令显示的是文档信息和示例索引,不是运行结果。想验证示例能否编译、输出是否匹配,仍然回到项目目录执行 go test。

三种查询方式怎么分工
实际使用时可以把命令分成三档。不要把 -ex 当成普通文档的替代开关,它解决的是“从声明继续找到示例”这一段路径。
| 命令形式 | 最适合的问题 | 主要结果 |
|---|---|---|
go doc 包或符号 | 这个 API 的签名和说明是什么? | 包文档、类型、函数、方法和注释 |
go doc -ex 包或符号 | 有哪些可执行示例可以先看? | 关联的 Example 列表和示例说明 |
go doc 包.示例名 | 这个具体示例怎样写? | 示例源码及其注释 |
Go 1.27 还支持把版本写进包查询,例如 go doc example.com/pkg@v1.2.3。当项目需要对照不同模块版本的文档时,这个能力和 -ex 结合起来,可以先定位版本,再找该版本暴露的示例;但版本是否可解析、模块是否能下载,仍取决于本机的模块环境。
指定示例名时,为什么能看到更多源码
当列表已经把候选示例列出来,下一步可以直接查询示例名。Go 1.27 的发布说明特别提到,传入示例名时,go doc 会连同示例源码和注释一起打印。
# 查看标准库中一个具体示例的源码与注释 go doc bytes.ExampleBuffer # 查看本地实验包中的具体示例 go doc example.com/go-doc-ex-demo/docdemo.ExampleNormalize
这一步很适合阅读“为什么这样调用”。普通 API 文档负责说明函数契约,Example 源码负责补充输入准备、错误处理和输出预期。若示例包含完整文件上下文,输出也可能比一段孤立代码更长,这不是 -ex 失效,而是示例本身承担了更多上下文。
迁移旧有文档查找习惯时记住三个边界
-ex不等于执行。它负责查找和展示符合 Example 约定的文档代码;要执行并检查输出,用go test。- 命名决定关联关系。优先使用
Example、ExampleType、ExampleType_Method这类约定命名,示例才能自然地挂到包、类型或方法上。 - 包级和符号级要分开用。第一次了解包时用包级查询,已经确定 API 后改用符号级查询,结果更短也更容易筛选。
# 先检查示例是否能通过测试;-run 只筛选 Example 函数 go test ./docdemo -run '^ExampleNormalize$' # 再回到文档侧查看同一示例的完整源码 go doc example.com/go-doc-ex-demo/docdemo.ExampleNormalize
这套顺序把“发现”和“验证”分开:go doc -ex 负责降低搜索成本,go test 负责给出编译和输出检查结果。对团队文档来说,示例既然可被测试,就应该把它当作代码的一部分维护,而不是只在文章里复制一份可能过期的片段。
常见问题
go doc -ex 为什么没有列出我的函数示例?
先检查文件是否位于包的测试文件中,函数是否使用 Example 命名规则,以及后缀是否符合小写约定。还要确认查询的包路径和符号名称没有写错。
go doc -ex 会自动运行示例吗?
不会。它负责查找和展示可执行示例;示例是否能编译、输出是否匹配,需要使用 go test 检查。
普通 go doc 和 go doc -ex 应该先用哪个?
不熟悉包时先用普通 go doc 看 API 结构,再用 -ex 找调用样例;已经明确符号时可以直接使用符号级的 -ex 查询。
Go 1.27 的这项改动不大,却把“读 API”与“找用法”接得更近。把 Example 函数按约定写好,再用 go doc -ex 做发现、用 go test 做验证,文档和代码就能形成一条更短的学习路径。
-
351 收藏
-
Golang · Go教程 | 1个月前 | 并发 · pprof · 故障排查 · Go教程 · net/http/pprof goroutineleak goroutine 泄漏 runtime/pprof Go 1.27243 收藏
-
Golang · Go教程 | 1个月前 | Go教程 · go fix modernizer Go 1.27 atomictypes embedlit slicesbackward unsafefuncs377 收藏
-
103 收藏
-
409 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习