我有一个函数,它采用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.所以我不确定我的代码做错了什么.希望有人可以解释,所以我能理解我的错误.
您需要使用指向用户的指针来解码数据,否则解码后的数据将在函数返回时被删除的对象副本中解码.
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)
保持接口参数不变,只需在传递用户时以及从界面中获取用户时使用指针.