2015-01-16 100 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,因爲它嵌入了該字段。