23

Goに構造体があることは知っていますが、私が知っている限りでは、構造体を定義する必要があります

type Circle struct{
    x,y,r float64
}

構造体に存在しない新しい変数をどのように宣言できるのか疑問に思っています

circle := new(Circle)
circle.color = "black"
4

4 に答える 4

57

map[string]interface{}動的 JSON を操作するには、(タイプの) マップを使用する必要があります。以下は、新しいマップを作成する例です。

// Initial declaration
m := map[string]interface{}{
    "key": "value",
}

// Dynamically add a sub-map
m["sub"] = map[string]interface{}{
    "deepKey": "deepValue",
}

JSON をマップにアンマーシャリングすると、次のようになります。

var f interface{}
err := json.Unmarshal(b, &f)

上記のコードは、次fのような構造を持つマップを に残します。

f = map[string]interface{}{
    "Name": "Wednesday",
    "Age":  6,
    "Parents": []interface{}{
        "Gomez",
        "Morticia",
    },
}

型アサーションを使用してアクセスする必要があります。そうしないと、Go はそれがマップであることを認識できません。

m := f.(map[string]interface{})

また、マップから引き出す各アイテムでアサーションまたはタイプ スイッチを使用する必要があります。非構造化 JSON を扱うのは面倒です。

詳しくは:

于 2016-11-12T23:33:44.457 に答える
0

できません。Go は静的に型付けされており、そのような構成は許可されていません。

構造体には、定義に直接関連するメモリ内のレイアウトがあり、そのような追加フィールドを格納する場所はありません。

代わりに地図を使用できます。さらに、&circleキーまたはキーの一部として使用して、マップ要素を任意の構造体に関連付けることができます。

type key struct {
    target interface{}
    field string
}

x := make(map[key]string)
x[key{ target: circle, field: "color" }] = "black"
于 2016-11-12T08:32:03.613 に答える