#go #goland
#Вперед #goland
Вопрос:
type Old struct {
UserID int `json:"user_ID"`
Data struct {
Address string `json:"address"`
} `json:"old_data"`
}
type New struct {
UserID int `json:"userId"`
Data struct {
Address string `json:"address"`
} `json:"new_data"`
}
func (old Old) ToNew() New {
return New{
UserID: old.UserID,
Data: { // from here it says missing expression
Address: old.Data.Address,
},
}
}
Что такое ошибка «отсутствующего выражения» при использовании структур?
Я преобразую старый объект в новый. Я уменьшил их, чтобы сразу перейти к сути, но преобразование намного сложнее. Поле userId, например, отлично работает. Но когда я использую struct (который в конечном итоге должен был быть объектом JSON), среда разработки Goland выдает сообщение «отсутствует выражение», а компилятор сообщает «отсутствует тип в составном литерале» в этой строке. Что я делаю не так? Может быть, мне следует использовать что-то другое вместо struct? Пожалуйста, помогите.
Ответ №1:
Data
это анонимная структура, поэтому вам нужно написать ее следующим образом:
type New struct {
UserID int `json:"userId"`
Data struct {
Address string `json:"address"`
} `json:"new_data"`
}
func (old Old) ToNew() New {
return New{
UserID: old.UserID,
Data: struct {
Address string `json:"address"`
}{
Address: old.Data.Address,
},
}
}
Я думаю, что было бы проще всего создать именованную Address
структуру.
Комментарии:
1. спасибо, это работает. не могли бы вы объяснить, почему это так? почему он не принимает »
json:"address"
» из определения структуры?2. Я предполагаю, что это связано с тем, что, насколько это касается Go, поля с тегами struct и поля без тегов являются совершенно разными типами.
Ответ №2:
Вы определяете Data
как встроенную структуру. При присвоении ему значений необходимо сначала ввести встроенное объявление:
func (old Old) ToNew() New {
return New{
UserID: old.UserID,
Data: struct {
Address string `json:"address"`
}{
Address: old.Data.Address,
},
}
}
Следовательно, обычно лучше определить отдельный тип для Data
, точно так же, как User
.