2012-02-23 6 views
1

における構造体の中のインターフェースを使用して、私は(切り取ら)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 
} 

コネティカットタイプであり、すべて一人でframeHandlerスタンドは?名前のないインターフェースですか? 後でコードで、彼らも貧しいインタフェースがnilであるかどうかをチェックしてみてください:

Conn(a).frameHandler == nil 

私自身の推測では、構造体の中frameHandlerがframeHandlerインターフェイスと一致するタイプであるということです、そしてその上に持っています名前はframeHandlerです。これは正しいです?とにかく楽しい言葉です。

答えて

9

この行:

frameHandler 

これとほぼ同等である:そのframeHandler

frameHandler frameHandler 

は、フィールドの名前そのタイプ両方です。さらにConnにはframeHandlerのすべてのフィールドとメソッドが追加されるため、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 
}
匿名フィールドのフィールドとメソッド(§メソッド宣言)は、struct(§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" 
}

+0

さて、それはでした。あなたも同様のタイプでそれを行うことができますか? 'myInt'は' myInt myInt'と等しくなりますか?ああ!あなたの追加だけで私の第二の考えに答えました。 – ANisus

+0

助けてくれてありがとう。言語は確かにそれが楽しい方法を持っています。 。良い点: – ANisus

+2

もframeHandlerの方法はまた、自動的にAnschelSchaffer-コーエン@コネティカット –

関連する問題