首页 > 解决方案 > 更改通过引用传递的结构的值

问题描述

我想传递一个结构作为对函数的引用,并根据它的类型,通过反射识别,进行适当的转换并将值存储在结构本身中。

但是,尽管代码运行,并且值在函数内部被识别和转换,但当控件返回到函数 main() 时,结构没有我希望存储在那里的值。

这是代码:

package main

import (
    "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

标签: pointersgo

解决方案


使用类型开关根据值的类型执行代码。在这种情况下不需要使用反射。

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
        }
    }
}

有关类型开关的更多信息:Go TourGo SpecificationEffective Go


推荐阅读