ANi*_*sus 1 struct interface go
在试图理解Go时,我遇到了这段代码websocket.go(剪掉):
type frameHandler interface {
HandleFrame(frame frameReader) (r frameReader, err error)
WriteClose(status int) (err error)
}
// Conn represents a WebSocket connection.
type Conn struct {
config *Config
request *http.Request
.
.
frameHandler
PayloadType byte
defaultCloseStatus int
}
Run Code Online (Sandbox Code Playgroud)
在Conn类型中,frameHandler那里独自站立?没有名字的界面?稍后在代码中他们甚至会尝试检查可怜的接口是否为零:
Conn(a).frameHandler == nil
Run Code Online (Sandbox Code Playgroud)
我自己的猜测是frameHandler结构内部是一个匹配frameHandler接口的类型,并且在其上面将有名称frameHandler.它是否正确?呵呵,无论如何有趣的语言.
这一行:
frameHandler
Run Code Online (Sandbox Code Playgroud)
大致相当于这个:
frameHandler frameHandler
Run Code Online (Sandbox Code Playgroud)
这frameHandler是该字段的名称及其类型.此外,它增加了所有字段和方法frameHandler的Conn,所以,如果conn是Conn,则conn.WriteClose(0)意味着conn.frameHandler.WriteClose(0).
正如Go编程语言规范所说:
使用类型但没有显式字段名称声明的字段是匿名字段(通俗地称为嵌入字段).必须将此类字段类型指定为类型名称
T或指向非接口类型名称的指针*T,并且T它本身可能不是指针类型.非限定类型名称充当字段名称.// A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4 struct { T1 // field name is T1 *T2 // field name is T2 P.T3 // field name is T3 *P.T4 // field name is T4 x, y int // field names are x and y }以下声明是非法的,因为字段名称在结构类型中必须是唯一的:struct { T // conflicts with anonymous field *T and *P.T *T // conflicts with anonymous field T and *P.T *P.T // conflicts with anonymous field T and *T }匿名字段的字段和方法(§Method声明)被提升为结构的普通字段和方法(§Selectors).以下规则适用于名为的结构类型S和名为的类型T:字段声明后面可以跟一个可选的字符串文字标记,该标记成为相应字段声明中所有字段的属性.标签通过反射界面可见,但否则将被忽略.
- 如果
S包含匿名字段T,则方法集S包括方法集T.- 如果
S包含匿名字段*T,则方法集S包括方法集*T(其本身包括方法集T).- 如果
S包含匿名字段T或*T,则方法集*S包括方法集*T(其本身包括方法集T).// A struct corresponding to the TimeStamp protocol buffer. // The tag strings define the protocol buffer field numbers. struct { microsec uint64 "field 1" serverIP6 uint64 "field 2" process string "field 3" }