generated from things-labs/cicd-go-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
map_key_slice.go
54 lines (49 loc) · 1.37 KB
/
map_key_slice.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
package structs
import (
"reflect"
)
// KeysOfMap return map key slice, need map key is string,
// if is not string, or not a map, it will panic.
func KeysOfMap(m interface{}) []string {
rv := reflect.Indirect(reflect.ValueOf(m))
if rv.Kind() == reflect.Invalid {
return []string{}
}
if rv.Kind() != reflect.Map {
panic("KeysOfMap: require a map")
}
keys := rv.MapKeys()
ss := make([]string, 0, len(keys))
for _, key := range keys {
key = reflect.Indirect(key)
if key.Kind() != reflect.String {
panic("KeysOfMap: require string type of map key")
}
ss = append(ss, key.String())
}
return ss
}
// KeysIntOfMap return map key slice, need map key is numeric.
// (int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64).
func KeysIntOfMap(m interface{}) []int64 {
rv := reflect.Indirect(reflect.ValueOf(m))
if rv.Kind() == reflect.Invalid {
return []int64{}
}
if rv.Kind() != reflect.Map {
panic("KeysIntOfMap: require a map")
}
keys := rv.MapKeys()
ss := make([]int64, 0, len(keys))
for _, key := range keys {
key = reflect.Indirect(key)
switch key.Kind() { // nolint: exhaustive
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
default:
panic("KeysIntOfMap: require integer type of map key")
}
ss = append(ss, key.Int())
}
return ss
}