Как использовать отражение, чтобы присвоить значения неизвестным структурам - PullRequest
0 голосов
/ 27 апреля 2020

Structs может содержать float32, int32, строку или указатель на struct. Вот мой код Но я не знаю, как присваивать значения структурам внутри.


type T struct {
    A int
    B string
    C *P
}

type P struct {
    A string
    B int
}

func main() {
    t := T{}
    decode(&t, []string{"99", "abc", "abc", "99"})
    fmt.Println(t)
}

1 Ответ

0 голосов
/ 27 апреля 2020

Вы можете сделать что-то вроде этого:

func decode(a interface{}, val []string) {
    rdecode(reflect.ValueOf(a).Elem(), val)
}

func rdecode(rv reflect.Value, val []string) int {
    var index int
    for i := 0; i < rv.NumField(); i++ {
        f := rv.Field(i)

        if f.Kind() == reflect.Ptr {
            if f.IsNil() {
                f.Set(reflect.New(f.Type().Elem()))
            }
            f = f.Elem()
        }

        switch f.Kind() {
        case reflect.Int:
            tmp, _ := strconv.Atoi(val[index])
            f.Set(reflect.ValueOf(tmp))
            index++
        case reflect.String:
            f.SetString(val[index])
            index++
        case reflect.Struct:
            index += rdecode(f, val[index:])
        default:
            break
        }
    }
    return index
}

https://play.golang.com/p/Jyj0flzDBhu

...