在Go中使用结构中的接口

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.它是否正确?呵呵,无论如何有趣的语言.

rua*_*akh 9

这一行:

    frameHandler
Run Code Online (Sandbox Code Playgroud)

大致相当于这个:

    frameHandler frameHandler
Run Code Online (Sandbox Code Playgroud)

frameHandler是该字段的名称及其类型.此外,它增加了所有字段和方法frameHandlerConn,所以,如果connConn,则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"
}

  • 另请注意,frameHandler的方法也是Conn的自动方法. (2认同)