【发布时间】:2020-06-29 12:50:37
【问题描述】:
在 Go 文档中,类型通常只显示导出的字段。例如,time.Timer 文档 (https://golang.org/pkg/time/#Timer) 显示如下:
键入计时器
Timer 类型表示单个事件。当定时器 过期,当前时间将在 C 上发送,除非 Timer 是 由 AfterFunc 创建。 Timer 必须使用 NewTimer 或 AfterFunc。
type Timer struct {
C <-chan Time
// contains filtered or unexported fields
}
Go 能够区分导出的和未导出的字段,所以这一点很清楚。但是,包含“过滤”字段是什么意思(例如在上面评论的上下文中)?
【问题讨论】:
-
没什么。这只是意味着它不会显示在 go doc 的输出中,这对于未导出(读取“私有”)字段是正常的。
-
理论上 godoc 可以应用不同的过滤器。
-
该注释是由
go/printer代码根据传递给它的 AST 生成的。一些 AST 节点有一个字段将它们标记为不完整,打印机使用该字段来决定是否打印该注释。然而,打印机无法知道该字段设置为 true 或 false 的规则和原因,因此按照惯例,假定它是由过滤器完成的,最常见的是 exportFilter,因此是语言。 -
“不完整”字段已导出,任何有权访问 AST 的人都可以将其设置为真/假。您可以自己遍历 AST,将每个 Incomplete 字段设置为 true,同时保持节点完好无损,然后将 AST 传递给打印机,然后打印机将生成结构及其所有字段、导出和未导出以及该注释。
-
Godoc 使用
ast.FileExports过滤 AST,默认情况下只删除未导出的节点,然后将 AST 传递给打印机。因此,在 Godoc 的情况下,该评论中的“过滤”与“未导出”是同义词。