Reflection GO中运行时类型的新结构实例
我试图在运行时使用结构的类型(reflect.TypeOf)创建结构的新实例。我在StackOverflow上遵循了这条线索。以下是我的实施方案(也在):Reflection GO中运行时类型的新结构实例,reflection,go,Reflection,Go,我试图在运行时使用结构的类型(reflect.TypeOf)创建结构的新实例。我在StackOverflow上遵循了这条线索。以下是我的实施方案(也在): 由于某种原因,我总是得到空结构。我无法设置字段或修改。有人能告诉我出了什么问题吗?我检查了你的代码。当您使用reflect新建一个类型时,您在valuetype中得到一个值,需要调用Interface()来获取新生成值的接口 检查代码 在运行reflect.New(sometype)时,将生成一个指针,用于指示sometype的reflect
由于某种原因,我总是得到空结构。我无法设置字段或修改。有人能告诉我出了什么问题吗?我检查了你的代码。当您使用reflect新建一个类型时,您在
value
type中得到一个值,需要调用Interface()
来获取新生成值的接口
检查代码
在运行reflect.New(sometype)时,将生成一个指针,用于指示sometype的reflect.Value。如果使用.Elem(),将获得reflect.value的直接值,该值为空。对于此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()
}
//print
//Hello, playground
//Value []byte: {"email":"jdoe@acme.com","name":"John Doe","_id":"142321"}
//main.UserInfo { }
//TypeOf(ret): main.UserInfo
//ValueOf(ret): { }
//Value: { }
在操场上:你也可以直接使用
reflect.ValueOf(ret.Interface()
。@FabianTamp我的错误,抵制错误的类型*UserInfo
,而不是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()
}
//print
//Hello, playground
//Value []byte: {"email":"jdoe@acme.com","name":"John Doe","_id":"142321"}
//main.UserInfo { }
//TypeOf(ret): main.UserInfo
//ValueOf(ret): { }
//Value: { }
//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}