猿问

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

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


然而,虽然代码运行,并且值在函数内部被识别和转换,但当控件返回到函数 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


慕容森
浏览 83回答 2
2回答

慕的地6264312

使用类型开关根据值的类型执行代码。在这种情况下不需要使用反射。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        }    }}

慕后森

您需要使用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))    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答