How to cast reflect.Value to its type?

后端 未结 4 1438
离开以前
离开以前 2021-01-31 07:50

How to cast reflect.Value to its type?

type Cat struct { 
    Age int
}

cat := reflect.ValueOf(obj)
fmt.Println(cat.Type()) // Cat

fmt.Println(Cat(cat).Age) //         


        
相关标签:
4条回答
  • 2021-01-31 08:19
    concreteCat,_ := reflect.ValueOf(cat).Interface().(Cat)
    

    see http://golang.org/doc/articles/laws_of_reflection.html fox example

    type MyInt int
    var x MyInt = 7
    v := reflect.ValueOf(x)
    y := v.Interface().(float64) // y will have type float64.
    fmt.Println(y)
    
    0 讨论(0)
  • 2021-01-31 08:20

    Seems the only way would be to do a switch statement similar to (code below) (also, something like the commented line would've-been nice though doesn't work (:()):

    func valuesFromStruct (rawV interface{}) []interface{} {
        v := reflect.ValueOf(rawV)
        out := make([]interface{}, 0)
        for i := 0; i < v.NumField(); i += 1 {
            field := v.Field(i)
            fieldType := field.Type()
            // out = append(out, field.Interface().(reflect.PtrTo(fieldType)))
            switch (fieldType.Name()) {
            case "int64":
                out = append(out, field.Interface().(int64))
                break`enter code here`
            case "float64":
                out = append(out, field.Interface().(float64))
                break
            case "string":
                out = append(out, field.Interface().(string))
                break
            // And all your other types (here) ...
            default:
                out = append(out, field.Interface())
                break
            }
        }
        return out
    }
    

    Cheers!

    0 讨论(0)
  • 2021-01-31 08:28

    This func auto-converts types as needed. It loads a config file values into a simple struct based on struct name and fields:

    import (
        "fmt"
        toml "github.com/pelletier/go-toml"
        "log"
        "os"
        "reflect"
    )
    func LoadConfig(configFileName string, configStruct interface{}) {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("LoadConfig.Recovered: ", r)
            }
        }()
        conf, err := toml.LoadFile(configFileName)
        if err == nil {
            v := reflect.ValueOf(configStruct)
            typeOfS := v.Elem().Type()
            sectionName := getTypeName(configStruct)
            for i := 0; i < v.Elem().NumField(); i++ {
                if v.Elem().Field(i).CanInterface() {
                    kName := conf.Get(sectionName + "." + typeOfS.Field(i).Name)
                    kValue := reflect.ValueOf(kName)
                    if (kValue.IsValid()) {
                        v.Elem().Field(i).Set(kValue.Convert(typeOfS.Field(i).Type))
                    }
                }
            }
        } else {
            fmt.Println("LoadConfig.Error: " + err.Error())
        }
    }
    
    0 讨论(0)
  • 2021-01-31 08:38

    Ok, I found it

    reflect.Value has a function Interface() that converts it to interface{}

    0 讨论(0)
提交回复
热议问题