Как объявить что-то вроде пустого объекта / структуры внутри 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
    },
}
Другие вопросы по тегам