Маршаллинг JSON с типом не экспортируется - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу использовать пользовательский тип, который не экспортируется, и определить интерфейс для его использования.Пользовательский тип будет реализовывать интерфейс, и все работает нормально, за исключением демаршалинга из JSON.

Я создал пример, чтобы объяснить его лучше:

type (
    Value interface {
        Set(k, v string)
    }

    value map[string]string
)

func New() Value {
    return value{}
}

func (val value) Set(k, v string) {
    val[k] = v
}

Этот подход не обеспечит прямой доступ ксопоставить и принудительно использовать функцию New () для создания объектов типа «Значение».

При попытке демонтировать объект, созданный с помощью New (), я получаю сообщение об ошибке:

Failed to unmarshal value json: cannot unmarshal object into Go value of type main.Value

Это можно исправить, заставив New () возвращать «значение» вместо «Значение», но все еще будет проблемой при попытке демонтажа такого объекта, как:

Storage struct {
        Val Value `json:"val"`
}

Есть предложения?Реализация Unmarshaler не помогает в этом случае.Я создаю фрагмент кода с этим примером: https://play.golang.org/p/IEalgBCsTVR

1 Ответ

0 голосов
/ 27 ноября 2018

Вам нужно дать json.Unmarshal() указатель на конкретный тип.Поэтому измените (с вашей связанной игровой площадки):

unm := New()

на

unm := New().(value)
...