0

私は完全に理解できないgoのいくつかの動作につまずいており、あらゆる種類の説明が歓迎されます:

type Test struct{
    Name string // or other metadata to be stored along the core map element
    map[string]string
}

上記のコードはコンパイルに失敗し、unexpected mapエラーが発生します。これはおそらく、構造体フィールド宣言が型でなければならないためmap[string]stringですが、型ではない理由を理解できません。

それをに変更する

type Embedded map[string]string

type Test struct{
    Name string
    Embedded
}

get はコンパイラ エラーを回避しますが、それでもTest["someKey"]コンパイラ エラー が発生しますinvalid operation: Test["someKey"] (index of type Test)

もちろん、無名フィールドを Test.Embedded["someKey"] で直接処理することもできますが、私の質問は次のとおりです。

  • リテラル マップ宣言が非匿名フィールド宣言の型として有効であるのに、匿名フィールドでは有効でないのはなぜですか
  • 包含型のインデックス作成が機能しないのはなぜですか? うまくいかないのはなぜですか?

明確にしていただきありがとうございます。

4

1 に答える 1

2
  1. 匿名フィールドは、名前付きタイプのみにする必要があります。おそらく、 TypeLiteralType、およびTypeNameを多少混乱させているでしょう。

  2. 匿名フィールドの参照は、仕様によって常にその型名によって行われるように規定されています。したがってTest.Embedded[key]、唯一の法的形式です。ここで、フィールド名とそれを使用する必要があるフィールド値を使用する必要のない埋め込みフィールドから継承される埋め込みフィールドメソッドを混乱させる可能性があります。

于 2013-08-02T09:39:47.977 に答える