| // Copyright 2012 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package reflect_test | |
| import ( | |
| "fmt" | |
| "io" | |
| "os" | |
| "reflect" | |
| ) | |
| func ExampleMakeFunc() { | |
| // swap is the implementation passed to MakeFunc. | |
| // It must work in terms of reflect.Values so that it is possible | |
| // to write code without knowing beforehand what the types | |
| // will be. | |
| swap := func(in []reflect.Value) []reflect.Value { | |
| return []reflect.Value{in[1], in[0]} | |
| } | |
| // makeSwap expects fptr to be a pointer to a nil function. | |
| // It sets that pointer to a new function created with MakeFunc. | |
| // When the function is invoked, reflect turns the arguments | |
| // into Values, calls swap, and then turns swap's result slice | |
| // into the values returned by the new function. | |
| makeSwap := func(fptr interface{}) { | |
| // fptr is a pointer to a function. | |
| // Obtain the function value itself (likely nil) as a reflect.Value | |
| // so that we can query its type and then set the value. | |
| fn := reflect.ValueOf(fptr).Elem() | |
| // Make a function of the right type. | |
| v := reflect.MakeFunc(fn.Type(), swap) | |
| // Assign it to the value fn represents. | |
| fn.Set(v) | |
| } | |
| // Make and call a swap function for ints. | |
| var intSwap func(int, int) (int, int) | |
| makeSwap(&intSwap) | |
| fmt.Println(intSwap(0, 1)) | |
| // Make and call a swap function for float64s. | |
| var floatSwap func(float64, float64) (float64, float64) | |
| makeSwap(&floatSwap) | |
| fmt.Println(floatSwap(2.72, 3.14)) | |
| // Output: | |
| // 1 0 | |
| // 3.14 2.72 | |
| } | |
| func ExampleStructTag() { | |
| type S struct { | |
| F string `species:"gopher" color:"blue"` | |
| } | |
| s := S{} | |
| st := reflect.TypeOf(s) | |
| field := st.Field(0) | |
| fmt.Println(field.Tag.Get("color"), field.Tag.Get("species")) | |
| // Output: | |
| // blue gopher | |
| } | |
| func ExampleTypeOf() { | |
| // As interface types are only used for static typing, a | |
| // common idiom to find the reflection Type for an interface | |
| // type Foo is to use a *Foo value. | |
| writerType := reflect.TypeOf((*io.Writer)(nil)).Elem() | |
| fileType := reflect.TypeOf((*os.File)(nil)) | |
| fmt.Println(fileType.Implements(writerType)) | |
| // Output: | |
| // true | |
| } |