...
1 package funk
2
3 import (
4 "fmt"
5 "reflect"
6 )
7
8
9 func Keys(out interface{}) interface{} {
10 value := redirectValue(reflect.ValueOf(out))
11 valueType := value.Type()
12
13 if value.Kind() == reflect.Map {
14 keys := value.MapKeys()
15
16 length := len(keys)
17
18 resultSlice := reflect.MakeSlice(reflect.SliceOf(valueType.Key()), length, length)
19
20 for i, key := range keys {
21 resultSlice.Index(i).Set(key)
22 }
23
24 return resultSlice.Interface()
25 }
26
27 if value.Kind() == reflect.Struct {
28 length := value.NumField()
29
30 resultSlice := make([]string, length)
31
32 for i := 0; i < length; i++ {
33 resultSlice[i] = valueType.Field(i).Name
34 }
35
36 return resultSlice
37 }
38
39 panic(fmt.Sprintf("Type %s is not supported by Keys", valueType.String()))
40 }
41
42
43 func Values(out interface{}) interface{} {
44 value := redirectValue(reflect.ValueOf(out))
45 valueType := value.Type()
46
47 if value.Kind() == reflect.Map {
48 keys := value.MapKeys()
49
50 length := len(keys)
51
52 resultSlice := reflect.MakeSlice(reflect.SliceOf(valueType.Elem()), length, length)
53
54 for i, key := range keys {
55 resultSlice.Index(i).Set(value.MapIndex(key))
56 }
57
58 return resultSlice.Interface()
59 }
60
61 if value.Kind() == reflect.Struct {
62 length := value.NumField()
63
64 resultSlice := make([]interface{}, length)
65
66 for i := 0; i < length; i++ {
67 resultSlice[i] = value.Field(i).Interface()
68 }
69
70 return resultSlice
71 }
72
73 panic(fmt.Sprintf("Type %s is not supported by Keys", valueType.String()))
74 }
75
View as plain text