Голанский динамический создатель Struct

Я новичок в Голанге. Я знаю, что есть Struct в Голанге. Но, насколько я знаю, вы должны определить структуру

type Circle struct{
    x,y,r float64
}

Мне интересно, как вы можете объявить новую переменную, которая не существует в Struct

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

спасибо заранее.

Ответ 1

Для работы с динамическим JSON вам понадобится карта (типа map[string]interface{}). Вот пример создания новой карты:

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

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

Unmarshalling 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 - это хлопот.

Больше информации:

Ответ 2

Вы не можете. Go статически типизирован и не допускает таких конструкций.

Структуры имеют макет в памяти, который напрямую связан с определением, и нет места для хранения таких дополнительных полей.

Вместо этого вы можете использовать карту. Кроме того, вы можете использовать &circle как ключ или часть ключа для связывания элементов карты с произвольными структурами.

type key struct {
    target interface{}
    field string
}

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

Ответ 3

Я начал работать над этим небольшим хранилищем https://github.com/Ompluscator/dynamic-struct

На этом этапе можно расширить существующую структуру во время выполнения, передав экземпляр структуры и изменив поля (добавление, удаление, изменение типов и тегов).

Все еще в процессе, так что не ожидайте чего-то огромного :)

ОБНОВЛЕНИЕ: На данный момент работа над библиотекой завершена, и она выглядит стабильной в течение последних нескольких месяцев :)