2 回答
TA贡献1806条经验 获得超8个赞
我查看了您的代码。当你用reflect新建一个类型时,你在Value
类型中获得了一个值,需要调用Interface()
以获取该新生成值的接口
检查代码 http://play.golang.org/p/CHWSV8EG7D
TA贡献1817条经验 获得超6个赞
在运行时reflect.New(sometype) 导致reflect.Value of sometype 的指针。如果您使用 .Elem() 将直接获得为空的反射值。对于这个 main.UserInfo{}。
//Return user defined object
func (db *DBEngine) Get(key string) interface{} {
decoder := json.NewDecoder(bytes.NewReader(db.DB[key]));
fmt.Println("Value []byte:", string(db.DB[key]))
ret := reflect.New(reflect.TypeOf(db.Template)).Elem()//<--wrong
fmt.Println(reflect.TypeOf(db.Template), ret)
decoder.Decode(ret)
return ret.Interface()
}
//Hello, playground
//Value []byte: {"email":"jdoe@acme.com","name":"John Doe","_id":"142321"}
//main.UserInfo { }
//TypeOf(ret): main.UserInfo
//ValueOf(ret): { }
//Value: { }
要获取 *sometype 值,请使用 .Interface(),这样您就可以解码了。看:
//Return user defined object
func (db *DBEngine) Get(key string) interface{} {
decoder := json.NewDecoder(bytes.NewReader(db.DB[key]));
fmt.Println("Value []byte:", string(db.DB[key]))
retValue := reflect.New(reflect.TypeOf(db.Template))
retInter := retValue.Interface()//<--
fmt.Println(reflect.TypeOf(db.Template), retInter)
decoder.Decode(retInter)
return retInter
}
结果:
Hello, playground
Value []byte: {"email":"jdoe@acme.com","name":"John Doe","_id":"142321"}
main.UserInfo &{ }
TypeOf(ret): *main.UserInfo
ValueOf(ret): &{jdoe@acme.com John Doe 142321}
Value: &{jdoe@acme.com John Doe 142321}
在操场上:https : //play.golang.org/p/veTUho5D4d
- 2 回答
- 0 关注
- 145 浏览
添加回答
举报