为了账号安全,请及时绑定邮箱和手机立即绑定

更改通过引用传递的结构的值

更改通过引用传递的结构的值

Go
慕容森 2023-05-04 16:08:16
我想传递一个结构作为对函数的引用,并根据它的类型(由反射识别)进行适当的转换并将值存储在结构本身中。然而,虽然代码运行,并且值在函数内部被识别和转换,但当控件返回到函数 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

        }

    }

}



查看完整回答
反对 回复 2023-05-04
?
慕后森

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

    }

}


查看完整回答
反对 回复 2023-05-04
  • 2 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信