Golang — ошибка пропущенного выражения в структурах

#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 .