0

如何省略 struct 字段,在我的情况下,我登录用户并返回包含用户数据和令牌的响应,但在这种情况下,我需要删除密码字段,我该怎么做?

type LoginFormData struct {
    Login    string `json:"name"`
    Password string `json:"password"`
}

data := new(LoginFormData)

if err := c.Bind(data); err != nil {
    return err
}

userData := data // omit password field

        return c.JSON(http.StatusOK, map[string]interface{}{
            "user": struct {
                Password string `json:"-"`
                *LoginFormData
            }{
                LoginFormData: userData,
                Password:      userData.Password,
            },
            "token": "slkdfj",
        })
4

3 回答 3

1
  1. 添加新结构而不是描述所需的结构
type LoginFormResponse struct {
    Login    string `json:"name"`
    Password string `json:"-"`
}
  1. 兑换
return c.JSON(http.StatusOK, map[string]interface{}{
            "user":  LoginFormResponse(*data),
            "token": "slkdfj",
        })
于 2019-07-09T07:26:17.183 回答
0

我认为您试图以错误的方式解决问题。

构建 API 时的最佳实践是为此使用 2 个结构。一个用于请求字段,一个用于响应字段。像这样:

type LoginFormReq struct {
    Login    string `json:"name"`
    Password string `json:"password"`
}

type LoginFormResp struct {
    Login    string `json:"name"`
    Password string `json:"-"`
}

这有时会导致结构之间的大量数据复制,但这在 Go 开发中是正常的,需要适当的关注点分离。我通常使用https://github.com/jinzhu/copier来处理这个。这是一个很棒的图书馆!

于 2021-04-26T21:55:21.060 回答
0

您可以创建一个帮助程序包来处理 api 响应

例如:helper/response_formatter.go:

package helper

type Response struct {
    Message string `json:"message"`
    Data interface{} `json:"data"`
}

func ResponseFormatter(message string, data interface{}) Response {
    response := Response{
        Message: message
        Data: data,
    }

    return response
}

然后在回声处理程序中:

response := helper.ResponseFormatter("authenticated", userData)

return c.JSON(http.StatusOK, response)
于 2021-03-31T04:37:42.440 回答