#go #struct
#Вперед #struct
Вопрос:
У меня есть структура следующим образом:-
type Inner struct {
FooInner string `json:"fooInner"`
BarInner string `json:"barInner,omitempty"`
}
type Root struct {
Inner
Foo string `json:"foo"`
Bar string `json:"bar"`
}
Я хочу, чтобы сначала были проанализированы поля «корневой» структуры, а затем поля «внутренней» структуры. Но здесь сначала анализируются поля внутренней структуры.
Комментарии:
1. Документ JSON определяет порядок полей. Итак, я предполагаю, что вы спрашиваете о маршалировании JSON (не синтаксическом анализе) и хотите, чтобы сначала были маршалированы корневые поля перед внутренним?
2. Структуры не анализируются. Они уже в нормализованной форме. Так что я не уверен, о чем вы спрашиваете.
3. Сначала должно произойти отражение полей «корневой» структуры, а затем других полей. Поскольку «Root» является родительской структурой, а дочерний элемент — «Внутренним».
Ответ №1:
Если вы спрашиваете о маршалировании JSON (которое не является синтаксическим анализом) и хотите, чтобы поля маршалировались в определенном порядке, маршалер обычно будет маршалировать поля в порядке их индексации и рекурсировать любые встроенные структуры по пути. Индексы полей структуры — как видно reflect
json.Marhsal
из используемого пакета — определяются порядком их появления в вашем коде.
Итак, сначала поместите нужные поля, а все встроенные структуры позже:
type Root struct {
Foo string `json:"foo"`
Bar string `json:"bar"`
Inner // <- move this last
}
b, _ := json.Marshal(Root{})
{"foo":"","bar":"","fooInner":""}
Комментарии:
1. Есть ли какой-либо другой способ, с помощью которого я могу заставить встроенную структуру наконец анализироваться, а не сначала анализироваться.
2. Вам нужно будет написать свой собственный маршаллер, чтобы сначала отдавать предпочтение локальным полям, прежде чем возвращаться к встроенным структурам. Но зачем вам это нужно? Это прекрасно, перечисляя поля в вашем коде в том порядке, в котором вы хотите, чтобы они были упорядочены.