【问题标题】:Is there a way to reuse a function for multiple structs in golang?有没有办法在golang中为多个结构重用一个函数?
【发布时间】:2021-01-10 04:58:29
【问题描述】:

我正在为一个项目编写后端,后端通过在请求正文中编码为 json 的 POST 请求接收用户数据。

我有两个结构:

在创建新帐户期间存储用户数据的结构:

type User struct {
    Guid        string ``
    Name        string `json:"Name"`
    Pass        string `json:"Pass"`
    Username    string `json:"Username"`
    Email       string `json:"Email"`
    Phone       string `json:"Phone"`
    Country     string `json:"Country"`
}

存储登录数据的结构

type Signin struct {
    Username string `json:"Username"`
    Pass string `json:"Pass"`
}

和一个json解码器函数(从请求体中解码数据):

func extractAndAssignInfo(req *http.Request, dataStruct interface{}) interface{}{

    decoder := json.NewDecoder(req.Body)
    err := decoder.Decode(&dataStruct)
    if err != nil {
        log.Fatal(err)
    }

    return reflect.ValueOf(dataStruct).Interface()
}

有没有办法让extractAndAssignInfo() 函数返回结构?

由于 Guid 是使用不同的函数计算的,所以当我尝试这样做时

userdata  := ExtractAndAssignInfo(req, User{})

函数的返回值给出了map[string]interface {}的类型,如果我将返回类型更改为结构,那么它将不是一个可以解码并返回所需结构的“通用”函数。

我不确定这是否是解决问题的最佳方法。我也很感激在返回结构时可以重用相同函数的任何其他方式。

【问题讨论】:

    标签: go


    【解决方案1】:

    使用此功能:

    func extractAndAssignInfo(req *http.Request, v interface{}) {
        decoder := json.NewDecoder(req.Body)
        err := decoder.Decode(v)
        if err != nil {
            log.Fatal(err)
        }
    }
    

    这样调用它将请求解码为User

    var userData User
    extractAndAssignInfo(req, &userData)
    

    像这样解码为Signin:

    var signin Signin
    extractAndAssignInfo(req, &signin)
    

    侧节点:在错误的请求数据上退出进程不是一个好主意。考虑返回错误extractAndAssignInfo 而不是调用log.Fatal

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 2021-06-29
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2010-09-28
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多