0

嗨,我正在学习 Go 语言,我想问一下如何创建空的 Object/Struct 作为域模型数据类型?我使用 Fiber 作为我的框架,这是我想从 golang 响应 api 获得的示例,如下所示:

{
  "success": true,
  "message": "Success registered",
  "data": {
      "first_name": "asdfa",
      "last_name": "asdfa",
      "email": "fadsfa",
      "password": "asdfasfas"
  }
}

这是我尝试的方法,这是我的 responseDto.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"
    }
  }
}

如您所见,我将有嵌套数据,但我不希望它嵌套,我希望它只嵌套一层,就像我的示例一样。我怎样才能实现它?我应该使用什么数据类型以及如何使用它来分配值?

4

2 回答 2

1

如果您不想要嵌套数据,请不要嵌套它。对不起,如果这听起来像一个重言式,但我不知道如何解决它。

具体来说:如果data a request.UserRequest,则将其添加为 struct 字段:

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
    },
}
于 2021-07-20T10:22:39.193 回答
1

您必须将用户“转换”为 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"`
}
于 2021-07-20T10:18:51.623 回答