5

次のgoスニペットでは、何が間違っていますか?

type Element interface{}

func buncode(in *os.File) (e Element) {
    <snip>
    e = make(map[string]interface{})
    for {
        var k string = buncode(in).(string)
        v := buncode(in)
        e[k] = v
    }
    <snip>
}

コンパイルすると、次のエラーが発生します。

gopirate.go:38: invalid operation: e[k] (index of type Element)

ダブルエウェテフ?

4

1 に答える 1

3

buncode関数で宣言します。e Elementここで、type e Element interface{}。変数eは、インデックス付けしようとしているスカラー値です。

タイプ

変数の静的型(または単に型)は、その宣言によって定義された型です。インターフェイスタイプの変数には、実行時に変数に格納される値の実際のタイプである、別個の動的タイプもあります。動的タイプは実行中に変化する可能性がありますが、インターフェイス変数の静的タイプに常に割り当てることができます。非インターフェイスタイプの場合、動的タイプは常に静的タイプです。

の静的タイプeElement、スカラーです。の動的タイプはeですmap[string]interface{}

これが、コードの改訂されたコンパイル可能なバージョンです。

type Element interface{}

func buncode(in *os.File) (e Element) {
    m := make(map[string]interface{})
    for {
        var k string = buncode(in).(string)
        v := buncode(in)
        m[k] = v
    }
    return m
}

なぜ再帰呼び出しを行うのbuncodeですか?

于 2011-08-12T14:01:52.057 に答える