在Go

2012-02-23 29 views
1

一個結構中使用的接口在試圖理解去,我碰到了這段代碼在websocket.go(剪斷):在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 
} 

在康涅狄格州鍵入frameHandler看臺上有一個人嗎?沒有名字的界面? 後來的代碼,他們甚至嘗試檢查,如果窮人接口是零:

Conn(a).frameHandler == nil 

我自己的猜測是,在結構內的frameHandler是一種將frameHandler接口匹配,並且最重要的是將有名稱frameHandler。它是否正確?無論如何,呵呵,有趣的語言。

回答

9

這條線:

frameHandler 

大致相當於此:

frameHandler frameHandler 
在於 frameHandler

既是字段的名稱及其類型。此外,它將frameHandler的所有字段和方法添加到Conn,因此如果connConn,那麼conn.WriteClose(0)表示conn.frameHandler.WriteClose(0)

由於the Go Programming Language Specification所言:

字段與類型聲明,但沒有明確的字段名稱是匿名場(俗稱嵌入式字段)。這種字段類型必須指定爲類型名稱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包含一個匿名字段TS的 方法集包括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" 
}

+0

好的,那麼它就像我懷疑的那樣。你能像那樣用類型來做嗎? 'myInt'將等於'myInt myInt'?啊!你的加入只是回答了我的第二個想法 – ANisus 2012-02-23 12:48:03

+0

感謝您的幫助。該語言肯定有它有趣的方式。 – ANisus 2012-02-23 12:50:05

+2

另請注意,frameHandler的方法自動也是Conn。 – 2012-02-23 21:51:15