【问题标题】:anonymous fields in type declaration?类型声明中的匿名字段?
【发布时间】:2015-03-15 15:41:03
【问题描述】:

我遇到了这种类型声明:

type Handler func(*Conn)

type Server struct {
  Handshake func(*Config, *http.Request) error
  Handler
}

(这是https://github.com/golang/net/blob/38c17adf51120973d1735785a7c02f8ce8297c5e/websocket/server.go#L55-L66的简化版

Server 结构中的第二个字段是匿名的。只有类型,没有名称。

这是类型声明的语法(https://golang.org/ref/spec#Type_declarations):

TypeDecl     = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
TypeSpec     = identifier Type .

它显然需要一个标识符名称。但是我引用的包含语法的部分也提到了匿名字段。

我不明白为什么这种语法是正确的以及如何使用匿名字段。

【问题讨论】:

    标签: go


    【解决方案1】:

    您想查看与结构有关的语法部分,而不仅仅是类型。请参阅:Struct typesAnonymousField 的使用。只看TypeSpec 的生产是把注意力集中在错误的地方。相反,请查看FieldDecl;语法表明我们有两种可能:命名字段 (IdentifierList Type) 或匿名字段 (AnonymousField)。

    匿名字段通常用于embedding。在您的示例中,Server 的行为类似于Handler,因为它嵌入了该字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多