github.com/selefra/selefra-utils@v0.0.4/pkg/reflect_util/reflect_util.go (about)

     1  package reflect_util
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"unsafe"
     7  )
     8  
     9  func GetStructPtrUnExportedField(source interface{}, fieldName string) reflect.Value {
    10  	v := reflect.ValueOf(source).Elem().FieldByName(fieldName)
    11  	return reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem()
    12  }
    13  
    14  func SetStructPtrUnExportedStrField(source interface{}, fieldName string, fieldVal interface{}) (err error) {
    15  	v := GetStructPtrUnExportedField(source, fieldName)
    16  	rv := reflect.ValueOf(fieldVal)
    17  	if v.Kind() != rv.Kind() {
    18  		return fmt.Errorf("invalid kind: expected kind %v, got kind: %v", v.Kind(), rv.Kind())
    19  	}
    20  	v.Set(rv)
    21  	return nil
    22  }
    23  
    24  func IsNil(x any) bool {
    25  
    26  	if x == nil {
    27  		return true
    28  	}
    29  
    30  	v := reflect.ValueOf(x)
    31  	if !v.IsValid() {
    32  		return true
    33  	}
    34  
    35  	switch v.Kind() {
    36  	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Slice:
    37  		return v.IsNil()
    38  	case reflect.Ptr:
    39  		elem := v.Elem()
    40  		if elem.IsValid() {
    41  			return IsNil(elem.Interface())
    42  		} else {
    43  			return true
    44  		}
    45  	default:
    46  		return false
    47  	}
    48  }