2016-04-22 4 views
-1

どのようなものか、これは行くにやっている、誰かがspecifially、次の構文が行くには何を意味するのか説明できます:は、キャスト

x.([]byte) 

私はこれが何を意味するのかわからない、これはキャストのですか?しかし、それはドットの直後なので、どのような方法ですか?

func of(x interface{}) ByteView { 
    if bytes, ok := x.([]byte); ok { 
     return ByteView{b: bytes} 
    } 
    return ByteView{s: x.(string)} 
} 

参考:https://github.com/golang/groupcache/blob/master/byteview_test.go#L55

+0

がこれをチェックしてくださいhttps://golang.org/doc/effective_go.html#interface_conversions –

+0

それはですインタフェースを実装する具体的な型にする便利な方法です。それは型アサーションです。インターフェース{}はどんなタイプでも受け入れることができます。このタイプが[]バイトの場合は 'bytes'に割り当てられ、 'ok'はそのタイプであることを示します。つまりokはブールです。これをチェックしてくださいhttps://golang.org/ref/spec#Type_assertions – Snowman

答えて

4

私たちは、このように参照する "タイプのアサーション。"

これはLanguage Specに完全に記載されています。リンク全体の答えではなく、全体の答えがSOであるためには、その仕様から最も関連性の高い情報を含めることにします。これがない私の答え... XインターフェイスタイプとタイプTの発現のために

x.(T) 

は、xがnilでないことを主張する主要 表現、ドキュメントであり、値が保存されていることxは、 タイプTである。表記x(T)は、タイプアサーションと呼ばれる。

より正確には、Tがインタフェースタイプでない場合、x。(T)は、xの動的タイプがタイプTと同一であることを主張します。この場合、Tは はx ;それ以外の場合は、xがタイプTの値を格納することができないため、タイプアサーションは で無効です。 Tがインターフェイスタイプである場合、x。(T)はx の動的タイプがインターフェイスTを実装すると主張します。

タイプアサーションが成立する場合、式の値はxに格納された値 で、そのタイプはTです。タイプアサーションがfalseの場合、 ランタイムパニックが発生します。言い換えれば、 xの動的タイプは実行時にしか知られていないにもかかわらず、 正しいプログラムでは、x。(T)のタイプはTであることが知られている。

var x interface{} = 7 // x has dynamic type int and value 7 
i := x.(int)   // i has type int and value 7 

type I interface { m() } 
var y I 
s := y.(string)  // illegal: string does not implement I (missing method m) 
r := y.(io.Reader)  // r has type io.Reader and y must implement both I and io.Reader 

特殊形態

v, ok = x.(T) 
v, ok := x.(T) 
var v, ok = x.(T) 

の割り当てまたは初期化に使用されるタイプのアサーションを追加 型なしブール値が得られます。アサーションが成立する場合、okの値はtrueです。 それ以外の場合はfalseで、vの値はタイプTのゼロ値です。 この場合、実行時パニックは発生しません。

有効Goはまた、インタフェース変換のセクションが含まれており、アサーションを入力する別の偉大なリソースです: https://golang.org/doc/effective_go.html#interface_conversions