github.com/expr-lang/expr@v1.16.9/internal/deref/deref.go (about) 1 package deref 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 func Deref(p any) any { 9 if p == nil { 10 return nil 11 } 12 13 v := reflect.ValueOf(p) 14 15 for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { 16 if v.IsNil() { 17 return nil 18 } 19 v = v.Elem() 20 } 21 22 if v.IsValid() { 23 return v.Interface() 24 } 25 26 panic(fmt.Sprintf("cannot dereference %v", p)) 27 } 28 29 func Type(t reflect.Type) reflect.Type { 30 if t == nil { 31 return nil 32 } 33 for t.Kind() == reflect.Ptr { 34 t = t.Elem() 35 } 36 return t 37 } 38 39 func Value(v reflect.Value) reflect.Value { 40 for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { 41 if v.IsNil() { 42 return v 43 } 44 v = v.Elem() 45 } 46 return v 47 }