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 }