8 type keyList []reflect.Value
10 func (l keyList) Len() int { return len(l) }
11 func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
12 func (l keyList) Less(i, j int) bool {
17 for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
21 for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
25 af, aok := keyFloat(a)
26 bf, bok := keyFloat(b)
36 if ak != reflect.String || bk != reflect.String {
39 ar, br := []rune(a.String()), []rune(b.String())
40 for i := 0; i < len(ar) && i < len(br); i++ {
44 al := unicode.IsLetter(ar[i])
45 bl := unicode.IsLetter(br[i])
54 for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
55 an = an*10 + int64(ar[ai]-'0')
57 for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
58 bn = bn*10 + int64(br[bi]-'0')
68 return len(ar) < len(br)
71 // keyFloat returns a float value for v if it is a number/bool
72 // and whether it is a number/bool or not.
73 func keyFloat(v reflect.Value) (f float64, ok bool) {
75 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
76 return float64(v.Int()), true
77 case reflect.Float32, reflect.Float64:
78 return v.Float(), true
79 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
80 return float64(v.Uint()), true
90 // numLess returns whether a < b.
91 // a and b must necessarily have the same kind.
92 func numLess(a, b reflect.Value) bool {
94 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
95 return a.Int() < b.Int()
96 case reflect.Float32, reflect.Float64:
97 return a.Float() < b.Float()
98 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
99 return a.Uint() < b.Uint()
101 return !a.Bool() && b.Bool()
103 panic("not a number")