如果我定义了类型type myInt64 int64
,我将如何使用反射设置它?代码如下panics reflect.Set:int64类型的值不能分配给main.myInt64类型
http://play.golang.org/p/scsXq4ofk6
package main
import (
"fmt"
"reflect"
)
type myInt64 int64
type MyStruct struct {
Name string
Age myInt64
}
func FillStruct(m map[string]interface{}, s interface{}) error {
structValue := reflect.ValueOf(s).Elem()
for name, value := range m {
structFieldValue := structValue.FieldByName(name)
val := reflect.ValueOf(value)
structFieldValue.Set(val)
}
return nil
}
func main() {
myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = int64(23)
result := &MyStruct{}
err := FillStruct(myData, result)
if err != nil {
fmt.Println(err)
}
fmt.Println(result)
}
答案 0 :(得分:3)
您必须为作业提供正确的类型。没有隐式类型转换。
您可以为您的功能提供myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = myInt64(23)
for name, value := range m {
structFieldValue := structValue.FieldByName(name)
fieldType := structFieldValue.Type()
val := reflect.ValueOf(value)
structFieldValue.Set(val.Convert(fieldType))
}
或者您可以在分配期间转换值
{{1}}