c++: decltype of (by-value captured reference) [PR79620]
[official-gcc.git] / libgo / go / reflect / example_test.go
blob3db971c3aeed7ab904fdc9cc93542383ef881b70
1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 package reflect_test
7 import (
8 "bytes"
9 "encoding/json"
10 "fmt"
11 "io"
12 "os"
13 "reflect"
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())
28 // Output:
29 // hi
30 // 42
31 // unhandled kind func
34 func ExampleMakeFunc() {
35 // swap is the implementation passed to MakeFunc.
36 // It must work in terms of reflect.Values so that it is possible
37 // to write code without knowing beforehand what the types
38 // will be.
39 swap := func(in []reflect.Value) []reflect.Value {
40 return []reflect.Value{in[1], in[0]}
43 // makeSwap expects fptr to be a pointer to a nil function.
44 // It sets that pointer to a new function created with MakeFunc.
45 // When the function is invoked, reflect turns the arguments
46 // into Values, calls swap, and then turns swap's result slice
47 // into the values returned by the new function.
48 makeSwap := func(fptr any) {
49 // fptr is a pointer to a function.
50 // Obtain the function value itself (likely nil) as a reflect.Value
51 // so that we can query its type and then set the value.
52 fn := reflect.ValueOf(fptr).Elem()
54 // Make a function of the right type.
55 v := reflect.MakeFunc(fn.Type(), swap)
57 // Assign it to the value fn represents.
58 fn.Set(v)
61 // Make and call a swap function for ints.
62 var intSwap func(int, int) (int, int)
63 makeSwap(&intSwap)
64 fmt.Println(intSwap(0, 1))
66 // Make and call a swap function for float64s.
67 var floatSwap func(float64, float64) (float64, float64)
68 makeSwap(&floatSwap)
69 fmt.Println(floatSwap(2.72, 3.14))
71 // Output:
72 // 1 0
73 // 3.14 2.72
76 func ExampleStructTag() {
77 type S struct {
78 F string `species:"gopher" color:"blue"`
81 s := S{}
82 st := reflect.TypeOf(s)
83 field := st.Field(0)
84 fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))
86 // Output:
87 // blue gopher
90 func ExampleStructTag_Lookup() {
91 type S struct {
92 F0 string `alias:"field_0"`
93 F1 string `alias:""`
94 F2 string
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)
107 } else {
108 fmt.Println("(not specified)")
112 // Output:
113 // field_0
114 // (blank)
115 // (not specified)
118 func ExampleTypeOf() {
119 // As interface types are only used for static typing, a
120 // common idiom to find the reflection Type for an interface
121 // type Foo is to use a *Foo value.
122 writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()
124 fileType := reflect.TypeOf((*os.File)(nil))
125 fmt.Println(fileType.Implements(writerType))
127 // Output:
128 // true
131 func ExampleStructOf() {
132 typ := reflect.StructOf([]reflect.StructField{
134 Name: "Height",
135 Type: reflect.TypeOf(float64(0)),
136 Tag: `json:"height"`,
139 Name: "Age",
140 Type: reflect.TypeOf(int(0)),
141 Tag: `json:"age"`,
145 v := reflect.New(typ).Elem()
146 v.Field(0).SetFloat(0.4)
147 v.Field(1).SetInt(2)
148 s := v.Addr().Interface()
150 w := new(bytes.Buffer)
151 if err := json.NewEncoder(w).Encode(s); err != nil {
152 panic(err)
155 fmt.Printf("value: %+v\n", s)
156 fmt.Printf("json: %s", w.Bytes())
158 r := bytes.NewReader([]byte(`{"height":1.5,"age":10}`))
159 if err := json.NewDecoder(r).Decode(s); err != nil {
160 panic(err)
162 fmt.Printf("value: %+v\n", s)
164 // Output:
165 // value: &{Height:0.4 Age:2}
166 // json: {"height":0.4,"age":2}
167 // value: &{Height:1.5 Age:10}
170 func ExampleValue_FieldByIndex() {
171 // This example shows a case in which the name of a promoted field
172 // is hidden by another field: FieldByName will not work, so
173 // FieldByIndex must be used instead.
174 type user struct {
175 firstName string
176 lastName string
179 type data struct {
180 user
181 firstName string
182 lastName string
185 u := data{
186 user: user{"Embedded John", "Embedded Doe"},
187 firstName: "John",
188 lastName: "Doe",
191 s := reflect.ValueOf(u).FieldByIndex([]int{0, 1})
192 fmt.Println("embedded last name:", s)
194 // Output:
195 // embedded last name: Embedded Doe