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

Sir*_*Sir 1 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
}
Run Code Online (Sandbox Code Playgroud)

使用功能:

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

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

我得到的错误:

json: Unmarshal(non-pointer main.User)
Run Code Online (Sandbox Code Playgroud)

由于我的DecodeJSON没有指针,因此被这条消息搞糊涂了user.所以我不确定我的代码做错了什么.希望有人可以解释,所以我能理解我的错误.

Top*_*opo 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")
}
Run Code Online (Sandbox Code Playgroud)

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