Get pointer to value using reflection

后端 未结 4 829
感动是毒
感动是毒 2020-12-28 21:30

I have a function that iterates through all fields of an interface passed as parameter. In order to achieve this is I am using reflection. The issue is that I do not know ho

4条回答
  •  遥遥无期
    2020-12-28 21:41

    Passing reflect.Value instead of interface{} seems to fix the problem, however I don't know why valueField.Interface() doesn't work.

    Working example : http://play.golang.org/p/nleA2YWMj8

    func InspectStructV(val reflect.Value) {
        if val.Kind() == reflect.Interface && !val.IsNil() {
            elm := val.Elem()
            if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
                val = elm
            }
        }
        if val.Kind() == reflect.Ptr {
            val = val.Elem()
        }
    
        for i := 0; i < val.NumField(); i++ {
            valueField := val.Field(i)
            typeField := val.Type().Field(i)
            address := "not-addressable"
    
            if valueField.Kind() == reflect.Interface && !valueField.IsNil() {
                elm := valueField.Elem()
                if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
                    valueField = elm
                }
            }
    
            if valueField.Kind() == reflect.Ptr {
                valueField = valueField.Elem()
    
            }
            if valueField.CanAddr() {
                address = fmt.Sprintf("0x%X", valueField.Addr().Pointer())
            }
    
            fmt.Printf("Field Name: %s,\t Field Value: %v,\t Address: %v\t, Field type: %v\t, Field kind: %v\n", typeField.Name,
                valueField.Interface(), address, typeField.Type, valueField.Kind())
    
            if valueField.Kind() == reflect.Struct {
                InspectStructV(valueField)
            }
        }
    }
    
    func InspectStruct(v interface{}) {
        InspectStructV(reflect.ValueOf(v))
    }
    

提交回复
热议问题