forked from fuxiaohei/jx
/
utils.go
97 lines (87 loc) · 1.97 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package gojx
import (
"fmt"
"reflect"
"sort"
"strings"
)
func getReflectTypeName(rt reflect.Type) string {
return strings.ToLower(fmt.Sprint(rt))
}
// get reflect type of value.
// if pointer, return inner type.
// only support struct type.
func getReflectType(a interface{}) (rt reflect.Type, name string, e error) {
rt = reflect.TypeOf(a)
if rt.Kind() != reflect.Ptr {
e = fmtError(ErrStrStructNeedPointer, rt)
return
}
rt = rt.Elem()
name = getReflectTypeName(rt)
if rt.Kind() != reflect.Struct {
e = fmtError(ErrStrStructNeedPointer, rt)
return
}
return
}
// get reflect value.
// if pointer, return inner value.
func getReflect(a interface{}) (rv reflect.Value, rt reflect.Type, name string, e error) {
rv = reflect.ValueOf(a)
if rv.Kind() != reflect.Ptr {
e = fmtError(ErrStrStructNeedPointer, rv.Type())
return
}
rv = rv.Elem()
rt = rv.Type()
name = strings.ToLower(fmt.Sprint(rt))
if rt.Kind() != reflect.Struct {
e = fmtError(ErrStrStructNeedPointer, rt)
return
}
return
}
// get field interface value in reflect value by field name.
func getReflectFieldValue(rv reflect.Value, fieldName string) interface{} {
rf := rv.FieldByName(fieldName)
if !rf.IsValid() {
return nil
}
return rf.Interface()
}
// set field value to reflect value.
// make sure the setting value's type is matched to field type in reflect value.
func setReflectField(rv reflect.Value, fieldName string, v interface{}) {
rf := rv.FieldByName(fieldName)
if !rf.IsValid() {
return
}
rf.Set(reflect.ValueOf(v))
}
func isInIntSlice(src []int, value int) (i int, b bool) {
for k, v := range src {
if v == value {
i = k
b = true
return
}
}
return
}
func isInInterfaceSlice(src []interface{}, value interface{}) (i int, b bool) {
for k, v := range src {
if v == value {
i = k
b = true
return
}
}
return
}
func sortIntSliceASC(src []int) {
sort.Sort(sort.IntSlice(src))
}
func sortIntSliceDESC(src []int) {
sort.Sort(sort.Reverse(sort.IntSlice(src)))
}