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 if ar[i] == '0' || br[i] == '0' {
55 for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- {
63 for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
64 an = an*10 + int64(ar[ai]-'0')
66 for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
67 bn = bn*10 + int64(br[bi]-'0')
77 return len(ar) < len(br)
80 // keyFloat returns a float value for v if it is a number/bool
81 // and whether it is a number/bool or not.
82 func keyFloat(v reflect.Value) (f float64, ok bool) {
84 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
85 return float64(v.Int()), true
86 case reflect.Float32, reflect.Float64:
87 return v.Float(), true
88 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
89 return float64(v.Uint()), true
99 // numLess returns whether a < b.
100 // a and b must necessarily have the same kind.
101 func numLess(a, b reflect.Value) bool {
103 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
104 return a.Int() < b.Int()
105 case reflect.Float32, reflect.Float64:
106 return a.Float() < b.Float()
107 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
108 return a.Uint() < b.Uint()
110 return !a.Bool() && b.Bool()
112 panic("not a number")