37 lines
		
	
	
		
			807 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			807 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package anynil
 | |
| 
 | |
| import "reflect"
 | |
| 
 | |
| // Is returns true if value is any type of nil. e.g. nil or []byte(nil).
 | |
| func Is(value any) bool {
 | |
| 	if value == nil {
 | |
| 		return true
 | |
| 	}
 | |
| 
 | |
| 	refVal := reflect.ValueOf(value)
 | |
| 	switch refVal.Kind() {
 | |
| 	case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice:
 | |
| 		return refVal.IsNil()
 | |
| 	default:
 | |
| 		return false
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Normalize converts typed nils (e.g. []byte(nil)) into untyped nil. Other values are returned unmodified.
 | |
| func Normalize(v any) any {
 | |
| 	if Is(v) {
 | |
| 		return nil
 | |
| 	}
 | |
| 	return v
 | |
| }
 | |
| 
 | |
| // NormalizeSlice converts all typed nils (e.g. []byte(nil)) in s into untyped nils. Other values are unmodified. s is
 | |
| // mutated in place.
 | |
| func NormalizeSlice(s []any) {
 | |
| 	for i := range s {
 | |
| 		if Is(s[i]) {
 | |
| 			s[i] = nil
 | |
| 		}
 | |
| 	}
 | |
| }
 |