类型声明中的匿名字段?
anonymous fields in type declaration?
我遇到了这个类型声明:
type Handler func(*Conn)
type Server struct {
Handshake func(*Config, *http.Request) error
Handler
}
的简化版
Server
结构中的第二个字段是匿名的。只有类型,没有名称。
这是类型声明的语法 (https://golang.org/ref/spec#Type_declarations):
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
TypeSpec = identifier Type .
而且它显然需要一个标识符名称。但是我引用的包含语法的部分也提到了匿名字段。
我不明白为什么这个语法是正确的以及如何使用匿名字段。
您想查看语法中与结构有关的部分,而不仅仅是类型。请参阅:Struct types 和 AnonymousField
的使用。只看 TypeSpec
的生产是将注意力集中在错误的地方。相反,看看 FieldDecl
;语法表明我们有两种可能性:命名字段(IdentifierList Type
)或匿名字段(AnonymousField
)。
匿名字段通常用于 embedding。在您的示例中,Server
将像 Handler
一样工作,因为它嵌入了该字段。
我遇到了这个类型声明:
type Handler func(*Conn)
type Server struct {
Handshake func(*Config, *http.Request) error
Handler
}
的简化版
Server
结构中的第二个字段是匿名的。只有类型,没有名称。
这是类型声明的语法 (https://golang.org/ref/spec#Type_declarations):
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
TypeSpec = identifier Type .
而且它显然需要一个标识符名称。但是我引用的包含语法的部分也提到了匿名字段。
我不明白为什么这个语法是正确的以及如何使用匿名字段。
您想查看语法中与结构有关的部分,而不仅仅是类型。请参阅:Struct types 和 AnonymousField
的使用。只看 TypeSpec
的生产是将注意力集中在错误的地方。相反,看看 FieldDecl
;语法表明我们有两种可能性:命名字段(IdentifierList Type
)或匿名字段(AnonymousField
)。
匿名字段通常用于 embedding。在您的示例中,Server
将像 Handler
一样工作,因为它嵌入了该字段。