我想传递一个结构作为对函数的引用,并根据它的类型(由反射识别)进行适当的转换并将值存储在结构本身中。然而,虽然代码运行,并且值在函数内部被识别和转换,但当控件返回到函数 main() 时,该结构没有我想存储在那里的值。这是代码:package mainimport ( "fmt" "reflect" "strconv")type x struct { f1 string f2 int f3 bool}func main() { s := x{} getData(&s.f1, "AAA") getData(&s.f2, "1") getData(&s.f3, "true") fmt.Println(s)}func getData(data interface{}, value string) { if value != "" { switch reflect.TypeOf(data).String() { case "*int": data, _ = strconv.Atoi(value) case "*bool": data, _ = strconv.ParseBool(value) case "*string": data = value } }}在这个例子中,我在{ 0 false}期待的同时得到{ AAA 1 true}是否有任何Golang GURU可以告诉我这段代码做错了什么?在去游乐场的链接下面 https://play.golang.org/p/l1_INJLOhAq
2 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
使用类型开关根据值的类型执行代码。在这种情况下不需要使用反射。
func getData(data interface{}, value string) {
if value != "" {
switch data := data.(type) {
case *int:
*data, _ = strconv.Atoi(value)
case *bool:
*data, _ = strconv.ParseBool(value)
case *string:
*data = value
}
}
}
慕后森
TA贡献1802条经验 获得超5个赞
您需要使用reflect.Value.Elem()来获取实际值而不是指针本身。
这是一个快速要点:
func getData(data interface{}, value string) {
switch v := data.(type) {
case *int:
val := reflect.ValueOf(v).Elem()
intVal, _ := strconv.Atoi(value)
val.SetInt(int64(intVal))
}
}
- 2 回答
- 0 关注
- 82 浏览
添加回答
举报
0/150
提交
取消