mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
// 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"
 | 
						|
	"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
 | 
						|
}
 |