1 回答
TA贡献2051条经验 获得超10个赞
你到底想要什么?您想更新传递给的变量Execute()吗?
如果是这样,您必须将指针传递给Execute(). 然后你只需要传递reflect.ValueOf(incrementedValue).Interface()给Scan(). 这是有效的,因为reflect.ValueOf(incrementedValue)是一个reflect.Value持有一个interface{}(您的参数的类型),它持有一个指针(您传递给的指针Execute()),Value.Interface()并将返回一个interface{}持有指针的类型的值,您必须传递的确切内容Scan()。
请参阅此示例(使用fmt.Sscanf(),但概念相同):
func main() {
i := 0
Execute(&i)
fmt.Println(i)
}
func Execute(i interface{}) {
fmt.Sscanf("1", "%d", reflect.ValueOf(i).Interface())
}
它将1从打印main(),因为该值1设置在 内Execute()。
如果您不想更新传递给 的变量Execute(),只需创建一个具有相同类型的新值,因为您使用的reflect.New()是返回Value指针的 ,您必须传递existingObj.Interface()返回一个interface{}持有指针的指针,您想要的东西传递给Scan(). (你所做的是你传递了一个指向 a 的指针reflect.Value,Scan()这不是所Scan()期望的。)
演示fmt.Sscanf():
func main() {
i := 0
Execute2(&i)
}
func Execute2(i interface{}) {
o := reflect.New(reflect.ValueOf(i).Elem().Type())
fmt.Sscanf("2", "%d", o.Interface())
fmt.Println(o.Elem().Interface())
}
这将打印2.
的另一个变体Execute2()是,如果您直接调用Interface()由 返回的值reflect.New():
func Execute3(i interface{}) {
o := reflect.New(reflect.ValueOf(i).Elem().Type()).Interface()
fmt.Sscanf("3", "%d", o)
fmt.Println(*(o.(*int))) // type assertion to extract pointer for printing purposes
}
这Execute3()将按3预期打印。
尝试Go Playground上的所有示例。
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报