Go中的非指针错误不确定是什么意思

时间:2017-11-03 04:25:26

标签: pointers go

我有一个函数,它将json解码器和接口作为其参数,我正在解码为在接口上传递的结构。像这样:

func DecodeJSON(decoder *json.Decoder, i interface{}) bool {
    if c, ok := i.(User); ok {
        err := decoder.Decode(c)
        if err != nil {
            fmt.Println(err)
            return false //err is not nil
        }
    }
    return false
}

功能的用法:

// Register test
func HandleRequest(w rest.ResponseWriter, r *rest.Request) {

    decoder := json.NewDecoder(r.Body)
    user := User{}
    if DecodeJSON(decoder, user) {    
        fmt.Println("success")
}

我得到的错误:

json: Unmarshal(non-pointer main.User)

由于我的DecodeJSON没有为user指针,所以对此消息感到困惑。所以我不确定我的代码做错了什么。希望有人可以解释,这样我就可以理解我的错误。

2 个答案:

答案 0 :(得分:5)

您需要使用指向用户的指针来解码数据,否则解码后的数据会在函数返回时被删除的对象副本中解码。

func DecodeJSON(decoder *json.Decoder, i interface{}) bool {
    if c, ok := i.(*User); ok {
        err := decoder.Decode(c)
        if err != nil {
            fmt.Println(err)
            return false //err is not nil
        }
    }
    return false
}

// Register test
func HandleRequest(w rest.ResponseWriter, r *rest.Request) {

    decoder := json.NewDecoder(r.Body)
    user := &User{}
    if DecodeJSON(decoder, user) {    
        fmt.Println("success")
}

保持接口参数不变,只需在传递用户时以及从界面中获取用户时使用指针。

答案 1 :(得分:0)

根据您的代码,您最好将功能签名更改为 func DecodeJSON(decoder *json.Decoder, user *User) bool

这将(1)消除显式的运行时转换,(2)使代码不那么模糊和安全,并且编译时检查。