web-dev-qa-db-ja.com

StructのGolang動的作成メンバー

私はGolangを初めて使います。 GolangにStructがあることは知っています。しかし、私が知っているすべてのために、あなたは構造体を定義する必要があります

type Circle struct{
    x,y,r float64
}

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

circle := new(Cirlce)
circle.color = "black"

事前にThx。

11

マップを使用する必要があります(タイプ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を扱うのは面倒です。

詳しくは:

27
James Hillyerd

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

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

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

type key struct {
    target interface{}
    field string
}

x := make(map[key]string)
x[key{ target: circle, field: "color" }] = "black"
2
nothingmuch

この小さなリポジトリで作業を開始しました https://github.com/Ompluscator/dynamic-struct

この時点で、構造体のインスタンスを渡し、フィールドを変更する(タイプとタグを追加、削除、変更する)ことにより、実行時に既存の構造体を拡張することができます。

まだ進行中ですので、巨大なものを期待しないでください:)

編集:この時点で、ライブラリの作業が完了し、最後の数ヶ月間安定しているように見えます:)

1
Marko Milojevic