有没有一种方法可以在golang中为多个结构重用功能?

时间:2020-09-23 22:51:15

标签: go

我正在为一个项目编写一个后端,后端通过在请求主体中编码为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 {}的类型,如果我将返回类型更改为一个结构,那么它将不是可以解码并返回所需结构的“通用”函数。 / p>

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

1 个答案:

答案 0 :(得分:2)

使用此功能:

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