Как объявить что-то вроде пустого объекта / структуры внутри Struct в Golang?
Привет, я изучаю голанг, и я хочу спросить, как создать пустой объект / структуру в качестве типа данных модели предметной области? Я использую Fiber в качестве своей структуры, и вот пример того, что я хочу получить от golang response api, выглядит примерно так:
{
"success": true,
"message": "Success registered",
"data": {
"first_name": "asdfa",
"last_name": "asdfa",
"email": "fadsfa",
"password": "asdfasfas"
}
}
и вот как я стараюсь, вот мой ответ Dto.go:
type ResponseDto struct {
Success bool `json:"success"`
Message string `json:"message"`
Data fiber.Map `json:"data"`
}
то вот как выглядел мой контроллер:
func Register(c *fiber.Ctx) error {
user := request.UserRequest{}
//do something then return
return c.JSON(models.ResponseDto{
Success: false,
Message: "Success registered",
Data: fiber.Map{
"data": user,
},
})
}
то вот ответ:
{
"success": false,
"message": "Success registered",
"data": {
"data": {
"first_name": "asdfa",
"last_name": "asdfa",
"email": "fadsfa",
"password": "asdfasfas"
}
}
}
как видите, у меня будут вложенные данные, но я не хочу, чтобы они были вложенными, я хочу, чтобы они были вложены только на один уровень, как в моем примере. Как я могу этого добиться? какой тип данных я должен использовать и как использовать его для присвоения значения?
2 ответа
Вы должны «конвертировать» пользователя в fiber.Map
func Register(c *fiber.Ctx) error {
user := request.UserRequest{}
//do something then return
return c.JSON(models.ResponseDto{
Success: false,
Message: "Success registered",
Data: fiber.Map{
"user_name": user.Name,
"user_age": user.Age,
},
})
}
Или вы можете изменить ResponseDto
type ResponseDto struct {
Success bool `json:"success"`
Message string `json:"message"`
Data request.UserRequest `json:"data"`
}
Если вам не нужны вложенные данные, не вкладывайте их. Извините, если это звучит как тавтология, но я не знаю, как еще решить эту проблему.
Конкретно: если
data
являетсяrequest.UserRequest
добавьте это как поле структуры:
type ResponseDto struct {
Success bool `json:"success"`
Message string `json:"message"`
Data request.UserRequest `json:"data"`
}
Но это объединяет ваши модели запроса и ответа. Если вы хотите избежать этого (я бы хотел), вы должны смириться с более подробным кодом и установить
fiber.Map
записи одну за другой. Нет, вы не можете перебирать поля структуры. Вы можете сделать свой код более выразительным, определив специальный тип:
type UserMap fiber.Map
type ResponseDto struct {
Success bool `json:"success"`
Message string `json:"message"`
Data UserMap `json:"data"`
}
resp := ResponseDto{
Success: false,
Message: "Success registered",
Data: UserMap{
"first_name": user.FirstName,
// ...and so on
},
}