...
Source file
src/reflect/example_test.go
Documentation: reflect
1
2
3
4
5 package reflect_test
6
7 import (
8 "bytes"
9 "encoding/json"
10 "fmt"
11 "io"
12 "os"
13 "reflect"
14 )
15
16 func ExampleKind() {
17 for _, v := range []any{"hi", 42, func() {}} {
18 switch v := reflect.ValueOf(v); v.Kind() {
19 case reflect.String:
20 fmt.Println(v.String())
21 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
22 fmt.Println(v.Int())
23 default:
24 fmt.Printf("unhandled kind %s", v.Kind())
25 }
26 }
27
28
29
30
31
32 }
33
34 func ExampleMakeFunc() {
35
36
37
38
39 swap := func(in []reflect.Value) []reflect.Value {
40 return []reflect.Value{in[1], in[0]}
41 }
42
43
44
45
46
47
48 makeSwap := func(fptr any) {
49
50
51
52 fn := reflect.ValueOf(fptr).Elem()
53
54
55 v := reflect.MakeFunc(fn.Type(), swap)
56
57
58 fn.Set(v)
59 }
60
61
62 var intSwap func(int, int) (int, int)
63 makeSwap(&intSwap)
64 fmt.Println(intSwap(0, 1))
65
66
67 var floatSwap func(float64, float64) (float64, float64)
68 makeSwap(&floatSwap)
69 fmt.Println(floatSwap(2.72, 3.14))
70
71
72
73
74 }
75
76 func ExampleStructTag() {
77 type S struct {
78 F string `species:"gopher" color:"blue"`
79 }
80
81 s := S{}
82 st := reflect.TypeOf(s)
83 field := st.Field(0)
84 fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))
85
86
87
88 }
89
90 func ExampleStructTag_Lookup() {
91 type S struct {
92 F0 string `alias:"field_0"`
93 F1 string `alias:""`
94 F2 string
95 }
96
97 s := S{}
98 st := reflect.TypeOf(s)
99 for i := 0; i < st.NumField(); i++ {
100 field := st.Field(i)
101 if alias, ok := field.Tag.Lookup("alias"); ok {
102 if alias == "" {
103 fmt.Println("(blank)")
104 } else {
105 fmt.Println(alias)
106 }
107 } else {
108 fmt.Println("(not specified)")
109 }
110 }
111
112
113
114
115
116 }
117
118 func ExampleTypeOf() {
119
120
121
122 writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()
123
124 fileType := reflect.TypeOf((*os.File)(nil))
125 fmt.Println(fileType.Implements(writerType))
126
127
128
129 }
130
131 func ExampleStructOf() {
132 typ := reflect.StructOf([]reflect.StructField{
133 {
134 Name: "Height",
135 Type: reflect.TypeOf(float64(0)),
136 Tag: `json:"height"`,
137 },
138 {
139 Name: "Age",
140 Type: reflect.TypeOf(int(0)),
141 Tag: `json:"age"`,
142 },
143 })
144
145 v := reflect.New(typ).Elem()
146 v.Field(0).SetFloat(0.4)
147 v.Field(1).SetInt(2)
148 s := v.Addr().Interface()
149
150 w := new(bytes.Buffer)
151 if err := json.NewEncoder(w).Encode(s); err != nil {
152 panic(err)
153 }
154
155 fmt.Printf("value: %+v\n", s)
156 fmt.Printf("json: %s", w.Bytes())
157
158 r := bytes.NewReader([]byte(`{"height":1.5,"age":10}`))
159 if err := json.NewDecoder(r).Decode(s); err != nil {
160 panic(err)
161 }
162 fmt.Printf("value: %+v\n", s)
163
164
165
166
167
168 }
169
170 func ExampleValue_FieldByIndex() {
171
172
173
174 type user struct {
175 firstName string
176 lastName string
177 }
178
179 type data struct {
180 user
181 firstName string
182 lastName string
183 }
184
185 u := data{
186 user: user{"Embedded John", "Embedded Doe"},
187 firstName: "John",
188 lastName: "Doe",
189 }
190
191 s := reflect.ValueOf(u).FieldByIndex([]int{0, 1})
192 fmt.Println("embedded last name:", s)
193
194
195
196 }
197
198 func ExampleValue_FieldByName() {
199 type user struct {
200 firstName string
201 lastName string
202 }
203 u := user{firstName: "John", lastName: "Doe"}
204 s := reflect.ValueOf(u)
205
206 fmt.Println("Name:", s.FieldByName("firstName"))
207
208
209 }
210
View as plain text