| package pointer | |
| import "reflect" | |
| func To[T any](v T) *T { | |
| vo := reflect.ValueOf(v) | |
| for { | |
| if vo.Kind() == reflect.Ptr { | |
| vo = vo.Elem() | |
| } else { | |
| break | |
| } | |
| } | |
| if vo.IsZero() { | |
| return nil | |
| } | |
| return &v | |
| } | |
| func Take[T any](v *T) T { | |
| if v == nil { | |
| t := reflect.TypeOf(v) | |
| _v := reflect.New(t) | |
| for t.Kind() == reflect.Ptr { | |
| t = t.Elem() | |
| _v = _v.Elem() | |
| } | |
| return _v.Interface().(T) | |
| } | |
| return *v | |
| } | |