当前位置:首页 > 文章列表 > Golang > Go教程 > Go go/doc.Examples 怎样区分空输出与未声明输出

Go go/doc.Examples 怎样区分空输出与未声明输出

来源:17golang原创 2026-11-05 19:31:11 0浏览 收藏

go/doc.Examples 返回的 Example.Output 为空字符串,既可能表示没有输出声明,也可能表示显式声明了空输出。需要同时读取 EmptyOutput:它为 true 表示期望空输出;它为 false 且 Output 为空时,表示未声明输出。不要仅用 Output == "" 把两者合并。

官方地址:https://pkg.go.dev/go/doc

先确定工具只抽取声明

为文档系统整理示例时,可以把测试源码当作文本交给 parser,再让 doc.Examples 从 AST 中抽取记录。这个工具的职责是识别注释声明,不是运行示例。对来源代码保持这个边界,既能避免误把预期文本写成实测输出,也不需要执行源文件内的函数。

本文示例在普通 Go 程序中使用标准库,不启动子进程、不调用 go test,也不把 Play 非空视为执行成功。本次文章没有运行下面的代码。

保留注释后,再提取 Example

关键参数是 parser.ParseComments。输出声明存在于注释中,解析时丢掉注释,后续自然无法可靠地区分状态。下面把三个原创示例放在一个源码字符串里,分别表达空输出、无声明和非空输出。

package main

import (
    "fmt"
    "go/doc"
    "go/parser"
    "go/token"
)

// classify 只解释源文件里的输出声明,不判定示例是否运行成功。
func classify(e *doc.Example) string {
    if e.EmptyOutput {
        return "显式空输出"
    }
    if e.Output != "" {
        return "声明非空输出"
    }
    return "未声明输出"
}

func main() {
    // 三种原创输入;字符串里的代码仅作为解析材料,不会被调用。
    src := `package sample_test
import "fmt"

// Example_blank 声明预期没有输出。
func Example_blank() {
    // Output:
}

// Example_missing 没有输出声明。
func Example_missing() {
    // 这里只是普通注释。
}

// Example_text 声明预期文本。
func Example_text() {
    fmt.Println("ready")
    // Output: ready
}
`
    fset := token.NewFileSet()
    file, err := parser.ParseFile(fset, "sample_test.go", src, parser.ParseComments)
    if err != nil {
        fmt.Println("解析失败:", err)
        return // 解析失败时不生成看似完整的声明清单。
    }
    for _, e := range doc.Examples(file) {
        fmt.Printf("%s: %s, Output=%q, EmptyOutput=%t\n",
            e.Name, classify(e), e.Output, e.EmptyOutput)
    }
}

Example_blank 的 Output 为空,EmptyOutput 为 true;Example_missing 的 Output 为空,EmptyOutput 为 false;Example_text 的 Output 包含 ready 对应的预期文本。这里给出的是代码语义推导,没有伪造终端运行记录。打印时使用 %q 是为了让换行等不可见字符可辨识。

源码注释解析与示例记录的静态组成图
静态结构图:源码、注释和 AST 是抽取工具的数据对象,Example 记录来自静态解析;图中不包含运行结果或终端截图。

按两个字段保存三种声明状态

EmptyOutputOutput应保存的含义
true空字符串显式期望空输出
false非空文本声明了预期文本
false空字符串未声明输出

对标准库抽取出的记录,上面三种组合足以解决本题。若业务代码手动构造 Example 并同时设置相互矛盾的字段,应另行定义输入契约,不能把手工对象的组合归咎于解析器。示例的 Unordered 字段另外表示输出顺序语义,不应被用来代替 EmptyOutput。

不要为省事对 Output 做 TrimSpace 后再覆盖原字段:原始文本有助于追踪声明来源。业务需要展示摘要时,可以额外保存展示字段,让抽取值和呈现值各有用途。

Example 字段与三种输出声明状态的关系图
静态说明图:Output 与 EmptyOutput 共同描述声明状态,Name 标识示例;这些字段不提供运行通过证明。

处理权限和审计记录时保留边界

实际接入仓库扫描时,先限定输入目录和源码大小,读取失败或语法解析失败单独记录。解析不执行函数,但仍会消耗内存和 CPU;面对不可信大文件,不应省略资源限制。本文的内嵌字符串只是为了把核心处理保持为一个可读例子。

清单可保留仓库相对文件名、Example.Name、Order、Output、EmptyOutput 和解析状态。doc.Examples 按 Name 排序;若报告希望展示源码顺序,应使用 Order 作依据,不能把返回列表顺序直接当作源文件顺序。

发布文档前,措辞应是“声明预期为空”或“未声明输出”,而非“执行后没有输出”。是否编译通过、运行时是否有副作用、输出是否匹配,需要独立的执行证据,静态抽取本身不能回答。

只有普通注释,函数体也没有打印,算空输出吗?

不算显式空输出声明。没有 Output 注释时,不能仅根据函数看起来安静就设置 EmptyOutput。

Play 非空是不是已经运行过?

不是。它是可用于表示完整示例程序的 AST 字段,不是运行回执。

直接调用 Examples 可以拿到 Suffix 吗?

该入口不填充 Suffix;官方文档说明 NewFromFiles 会为其从测试文件找到的示例填充此字段。不要据此误判输出声明缺失。

技术依据:Example 与 Examples 官方文档、示例抽取官方实现。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go xml.Decoder AutoClose 兼容缺少结束标签的 HTML 片段Go xml.Decoder AutoClose 兼容缺少结束标签的 HTML 片段
上一篇
Go xml.Decoder AutoClose 兼容缺少结束标签的 HTML 片段
Go json.Encoder 怎样避免把 HTML 字符转成转义序列
下一篇
Go json.Encoder 怎样避免把 HTML 字符转成转义序列
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    897次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    902次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    986次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    973次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    798次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码