forked from cloudevents/sdk-go
/
allocate.go
41 lines (37 loc) · 1.02 KB
/
allocate.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
/*
Copyright 2021 The CloudEvents Authors
SPDX-License-Identifier: Apache-2.0
*/
package types
import "reflect"
// Allocate allocates a new instance of type t and returns:
// asPtr is of type t if t is a pointer type and of type &t otherwise
// asValue is a Value of type t pointing to the same data as asPtr
func Allocate(obj interface{}) (asPtr interface{}, asValue reflect.Value) {
if obj == nil {
return nil, reflect.Value{}
}
switch t := reflect.TypeOf(obj); t.Kind() {
case reflect.Ptr:
reflectPtr := reflect.New(t.Elem())
asPtr = reflectPtr.Interface()
asValue = reflectPtr
case reflect.Map:
reflectPtr := reflect.MakeMap(t)
asPtr = reflectPtr.Interface()
asValue = reflectPtr
case reflect.String:
reflectPtr := reflect.New(t)
asPtr = ""
asValue = reflectPtr.Elem()
case reflect.Slice:
reflectPtr := reflect.MakeSlice(t, 0, 0)
asPtr = reflectPtr.Interface()
asValue = reflectPtr
default:
reflectPtr := reflect.New(t)
asPtr = reflectPtr.Interface()
asValue = reflectPtr.Elem()
}
return
}