【问题标题】:What does it mean if a field is "filtered" in Go?如果一个字段在 Go 中被“过滤”,这意味着什么?
【发布时间】: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 的情况下,该评论中的“过滤”与“未导出”是同义词。

标签: go godoc


【解决方案1】:

那个commentgo/printer 代码根据传递给它的 AST 生成。一些 AST 节点有一个 field 将它们标记为不完整,并且此字段是打印机的 useddecide 是否打印该评论。然而,打印机无法知道该字段设置为真或假的规则和原因,因此按照惯例,假定它是由过滤器完成的,最常见的是exportFilter,因此是语言。

Incomplete 字段已导出,任何有权访问 AST 的人都可以将其设置为 true/false。您可以自己遍历 AST,将每个 Incomplete 字段设置为 true,同时保持节点完好无损,然后将 AST 传递给打印机,然后打印机将生成结构及其所有字段、导出和未导出以及该注释。

Godoc filters AST 和 ast.FileExports 默认情况下仅删除未导出的节点,然后将 passes AST 删除到打印机。因此,在 Godoc 的情况下,该评论中的“过滤”与“未导出”是同义词。


Playground link 说明打印机的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多