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