Reflection GO中运行时类型的新结构实例

Reflection GO中运行时类型的新结构实例,reflection,go,Reflection,Go,我试图在运行时使用结构的类型(reflect.TypeOf)创建结构的新实例。我在StackOverflow上遵循了这条线索。以下是我的实施方案(也在): 由于某种原因,我总是得到空结构。我无法设置字段或修改。有人能告诉我出了什么问题吗?我检查了你的代码。当您使用reflect新建一个类型时,您在valuetype中得到一个值,需要调用Interface()来获取新生成值的接口 检查代码 在运行reflect.New(sometype)时,将生成一个指针,用于指示sometype的reflect

我试图在运行时使用结构的类型(reflect.TypeOf)创建结构的新实例。我在StackOverflow上遵循了这条线索。以下是我的实施方案(也在):


由于某种原因,我总是得到空结构。我无法设置字段或修改。有人能告诉我出了什么问题吗?

我检查了你的代码。当您使用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}