Можно ли маршалировать структуру go, включая имя карты?

Скажем, у меня есть структура go, которая настроена следующим образом:

type TestStruct struct {
    ID string
    ConfigTest         map[string]Object
    
}

С объектом внутри с тегами yaml/json для сортировки (и последующего сохранения в файл), например:

type Object struct {
    ID          string  `yaml:"ID"`
    Value       float64 `yaml:"Value"`
}

Итак, когда я собираю TestStruct.ConfigTestи сохраните его в файл, используя ioutil.WriteFile() Я получаю что-то вроде этого на выходе:

obj1:
    ID: "Hello"
    Value: 1.2
obj2:
    ID: "World"
    Value: 3.4
...(etc)

Но на самом деле я хочу упорядочить и сохранить файл следующим образом:

Objects:  
    obj1:
        ID: "Hello"
        Value: 1.2
    obj2:
        ID: "World"
        Value: 3.4
    ...(etc)

Это возможно?

1 ответ

Решение

У вас есть два основных варианта:

Повторное использование TestStruct:

+ Изменить TestStruct иметь соответствующие метки в полях: один для пропуска идентификатора маршалинга, другой для присвоения желаемого имени ConfigTest.

type TestStruct struct {
  ID string                             `yaml:"-"`
  ConfigTest         map[string]Object  `yaml:"Objects"`
}

Используйте структуру оболочки:

Если вы не можете или не хотите изменять TestStruct (то есть: потому что он уже где-то маршалирован), вы можете использовать структуру-оболочку:

type WrapperStruct struct {
  ConfigTest         map[string]Object  `yaml:"Objects"`
}

И маршалируйте новую структуру оболочки вместо MyStruct.

Другие вопросы по тегам