GetPointer return the pointer of the interface.
(v any)
| 20 | |
| 21 | // GetPointer return the pointer of the interface. |
| 22 | func GetPointer(v any) any { |
| 23 | t := reflect.TypeOf(v) |
| 24 | if t.Kind() == reflect.Ptr { |
| 25 | if tt := t.Elem(); tt.Kind() == reflect.Ptr { // pointer of pointer |
| 26 | if tt.Elem().Kind() == reflect.Ptr { |
| 27 | panic("pointer of pointer of pointer is not supported") |
| 28 | } |
| 29 | el := reflect.ValueOf(v).Elem() |
| 30 | if el.IsZero() { |
| 31 | vv := reflect.New(tt.Elem()) |
| 32 | el.Set(vv) |
| 33 | return vv.Interface() |
| 34 | } else { |
| 35 | return el.Interface() |
| 36 | } |
| 37 | } else { |
| 38 | if reflect.ValueOf(v).IsZero() { |
| 39 | vv := reflect.New(t.Elem()) |
| 40 | return vv.Interface() |
| 41 | } |
| 42 | return v |
| 43 | } |
| 44 | } |
| 45 | return reflect.New(t).Interface() |
| 46 | } |
| 47 | |
| 48 | // GetType return the underlying type. |
| 49 | func GetType(v any) reflect.Type { |
searching dependent graphs…