github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/ginx/anyfn/ptr.go (about)

     1  package anyfn
     2  
     3  import "reflect"
     4  
     5  func ConvertPtr(isPtr bool, v reflect.Value) reflect.Value {
     6  	if !isPtr {
     7  		return reflect.Indirect(v)
     8  	}
     9  
    10  	if v.Kind() == reflect.Ptr {
    11  		return v
    12  	}
    13  
    14  	p := reflect.New(v.Type())
    15  	p.Elem().Set(v)
    16  
    17  	return p
    18  }
    19  
    20  // IndirectTypeOf returns the non-ptr type of v.
    21  func IndirectTypeOf(v interface{}) reflect.Type {
    22  	if v == nil {
    23  		return reflect.TypeOf(v)
    24  	}
    25  
    26  	var t reflect.Type
    27  	if vt, ok1 := v.(reflect.Type); ok1 {
    28  		t = vt
    29  	} else if vt, ok2 := v.(reflect.Value); ok2 {
    30  		t = vt.Type()
    31  	} else {
    32  		t = reflect.TypeOf(v)
    33  	}
    34  
    35  	if t.Kind() == reflect.Ptr {
    36  		t = t.Elem()
    37  	}
    38  
    39  	return t
    40  }