В Golang у меня есть структура, членом которой является пользовательский тип int с постоянными значениями.По сути, пользовательский тип является логическим перечислением.
type Flavor int
const (
Vanilla Flavor = iota
Chocolate
Strawberry
)
func (f *Flavor) MarshalJSON() ([]byte, error) {
return []byte(strconv.Quote(f.String())), nil
}
Пользовательский тип определил функции MarshalJSON и UnmarshalJSON, поэтому при сериализации пользовательского типа в JSON я ожидаю получить строку значения в сериализованном выводе, а незначение int.
Моя проблема в том, что если у меня есть указатель на содержащий тип, то содержащий маршалы типа используют пользовательскую функцию, но если попытаться выполнить маршалинг только с помощью значения структуры, пользовательский MarshalJSON не вызывается пакетом JSON
type Dessert struct {
Flavor Flavor `json:"flavor"`
Count int
}
....
d := Dessert{Strawberry, 13}
b, err = json.Marshal(d) // !! does not invoke members Marshal !!
b, err = json.Marshal(&d) // works as expected
....
производит
{"flavor":2,"Count":13}
{"flavor":"Strawberry","Count":13}
Я ожидал второй вывод в обоих случаях.
Почему передача значения структуры не вызывает MarshalJSON для члена, но кодирует в противном случае правильный JSON?
полный рабочий код см. https://play.golang.org/p/mOl1GHhgynf