2015-01-16 135 views
1

我碰到这种类型的声明来了:类型声明中的匿名字段?

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 . 

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

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

回答

2

你想看看与结构有关的语法部分,而不仅仅是类型。参见:Struct typesAnonymousField的使用。仅看TypeSpec的产量是关注错误的地方。相反,请看FieldDecl;语法表明我们有两种可能性:命名字段(IdentifierList Type)或匿名字段(AnonymousField)。

匿名字段通常用于embedding。在你的例子中,Server就像Handler,因为它嵌入了该字段。