Можно ли маршалировать структуру 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
.