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 }