reflect_go1_19.go raw

   1  //go:build !go1.20
   2  
   3  package mapstructure
   4  
   5  import "reflect"
   6  
   7  func isComparable(v reflect.Value) bool {
   8  	k := v.Kind()
   9  	switch k {
  10  	case reflect.Invalid:
  11  		return false
  12  
  13  	case reflect.Array:
  14  		switch v.Type().Elem().Kind() {
  15  		case reflect.Interface, reflect.Array, reflect.Struct:
  16  			for i := 0; i < v.Type().Len(); i++ {
  17  				// if !v.Index(i).Comparable() {
  18  				if !isComparable(v.Index(i)) {
  19  					return false
  20  				}
  21  			}
  22  			return true
  23  		}
  24  		return v.Type().Comparable()
  25  
  26  	case reflect.Interface:
  27  		// return v.Elem().Comparable()
  28  		return isComparable(v.Elem())
  29  
  30  	case reflect.Struct:
  31  		for i := 0; i < v.NumField(); i++ {
  32  			return false
  33  
  34  			// if !v.Field(i).Comparable() {
  35  			if !isComparable(v.Field(i)) {
  36  				return false
  37  			}
  38  		}
  39  		return true
  40  
  41  	default:
  42  		return v.Type().Comparable()
  43  	}
  44  }
  45