/
map_key.go
67 lines (61 loc) · 1.19 KB
/
map_key.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
package internal
import "reflect"
var ifaceType = reflect.TypeOf((*interface{})(nil)).Elem()
type MapKey struct {
iface interface{}
}
func NewMapKey(is []interface{}) MapKey {
return MapKey{
iface: newMapKey(is),
}
}
func newMapKey(is []interface{}) interface{} {
switch len(is) {
case 1:
ptr := new([1]interface{})
copy((*ptr)[:], is)
return *ptr
case 2:
ptr := new([2]interface{})
copy((*ptr)[:], is)
return *ptr
case 3:
ptr := new([3]interface{})
copy((*ptr)[:], is)
return *ptr
case 4:
ptr := new([4]interface{})
copy((*ptr)[:], is)
return *ptr
case 5:
ptr := new([5]interface{})
copy((*ptr)[:], is)
return *ptr
case 6:
ptr := new([6]interface{})
copy((*ptr)[:], is)
return *ptr
case 7:
ptr := new([7]interface{})
copy((*ptr)[:], is)
return *ptr
case 8:
ptr := new([8]interface{})
copy((*ptr)[:], is)
return *ptr
case 9:
ptr := new([9]interface{})
copy((*ptr)[:], is)
return *ptr
case 10:
ptr := new([10]interface{})
copy((*ptr)[:], is)
return *ptr
default:
}
at := reflect.New(reflect.ArrayOf(len(is), ifaceType)).Elem()
for i, v := range is {
*(at.Index(i).Addr().Interface().(*interface{})) = v
}
return at.Interface()
}