我有一个函数,它将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
指针,所以对此消息感到困惑。所以我不确定我的代码做错了什么。希望有人可以解释,这样我就可以理解我的错误。
答案 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)使代码不那么模糊和安全,并且编译时检查。