-
Notifications
You must be signed in to change notification settings - Fork 1
/
types.go
108 lines (94 loc) · 2.18 KB
/
types.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
98
99
100
101
102
103
104
105
106
107
108
package utils
import (
"reflect"
)
// IsComparableType gets the value type and checks whether the type is comparable or not.
//
// IsComparableType(1) // true for int
// IsComparableType(1.0) // true for float64
// IsComparableType("") // true for string
// IsComparableType(nil) // false for nil
// IsComparableType(SomeStruct{}) // false for struct
// IsComparableType(&SomeStruct{}) // false for pointer
func IsComparableType(v any) bool {
switch v.(type) {
case
int, int8, int16, int32, int64, // Signed integer
uint, uint8, uint16, uint32, uint64, uintptr, // Unsigned integer
float32, float64, // Floating-point number
string: // string
return true
default:
return false
}
}
// IsSameType compares two values' type.
//
// v1 := 1 // int
// v2 := 2 // int
// v3 := Pointer(3) // *int
// IsSameType(v1, v2) // true
// IsSameType(v1, v3) // false
func IsSameType(v1, v2 any) bool {
ty1 := TypeOf(v1)
ty2 := TypeOf(v2)
return ty1 == ty2
}
// IsSameRawType compares two values' type without pointer.
//
// v1 := 1 // int
// v2 := 2 // int
// v3 := Pointer(3) // *int
// IsSameRawType(v1, v2) // true
// IsSameRawType(v1, v3) // true
func IsSameRawType(v1, v2 any) bool {
return RawTypeOf(v1) == RawTypeOf(v2)
}
// TypeOf returns the type of the value represented in string.
//
// TypeOf(nil) // "<nil>"
// TypeOf(1) // "int"
// TypeOf("test") // "string"
// TypeOf(&http.Client{}) // "*http.Client"
func TypeOf(v any) string {
t := reflect.TypeOf(v)
if t == nil {
return "<nil>"
}
return t.String()
}
// RawTypeOf returns the type string name without pointer.
//
// RawTypeOf(nil) // "<nil>"
// RawTypeOf(1) // "int"
// RawTypeOf("test") // "string"
// RawTypeOf(&http.Client{}) // "http.Client"
func RawTypeOf(v any) string {
ty := reflect.TypeOf(v)
if ty == nil {
return "<nil>"
}
for ty.Kind() == reflect.Ptr {
ty = ty.Elem()
}
return ty.String()
}
// GetElem returns the element without pointer.
//
// v := 1
// vp := &v
// GetElem(v) // 1
// GetElem(vp) // 1
func GetElem(o any) any {
if o == nil {
return nil
}
v := reflect.ValueOf(o)
if v.Kind() == reflect.Ptr && v.IsNil() {
return nil
}
for v.Kind() == reflect.Ptr {
v = v.Elem()
}
return v.Interface()
}