func deserialize(request *http.Request,typ reflect.Type) (interface{}, *httpNet.HandlerError){
data,e:=ioutil.ReadAll(request.Body)
fmt.Println(string(data))
if e !=nil{
return nil,&httpNet.HandlerError{e,"could not read request",http.StatusBadRequest}
}
v:=typ.Elem()
payload:=reflect.New(v).Elem().Interface()
eaa:= json.NewDecoder(request.Body).Decode(payload)
if e!=nil{
fmt.Println(eaa.Error())
}
fmt.Println(payload)
fmt.Println(reflect.ValueOf(payload)
)
return payload,nil
}
称呼它:
r,_:= deserialize(request,reflect.TypeOf(&testData{}))
它不会抛出错误并且看起来对我来说是完全有效的操作,但结果是期望类型的空结构。
问题是什么?
答案 0 :(得分:3)
问题是您正在传递类型的非指针实例:
payload:=reflect.New(v).Elem().Interface()
表示“为该类型分配一个新指针,然后获取它的值,并将其提取为interface{}
。
你应该把它保存在:
payload:=reflect.New(v).Interface()
BTW您传递指针类型,提取其Elem()
,然后分配指针也是多余的。做这样的事情:
if type.Kind() == reflect.Ptr {
typ = typ.Elem()
}
payload := reflect.New(typ).Interface()
然后你可以将指针和非指针都传递给函数。
编辑:工作场所示例:http://play.golang.org/p/TPafxcpIU5