func typeCycle() {
	t := reflect.TypeOf(0)
	u := reflect.TypeOf("")
	v := reflect.TypeOf(T{})
	for unknown {
		t = reflect.PtrTo(t)
		t = reflect.SliceOf(t)
		u = reflect.SliceOf(u)
		if unknown {
			v = reflect.ChanOf(reflect.BothDir, v)
		} else {
			v = reflect.PtrTo(v)
		}
	}
	print(reflect.Zero(t).Interface())  
	print(reflect.Zero(u).Interface())  
	print(reflect.Zero(v).Interface())  
}
When the output of a type constructor flows to its input, we must
bound the set of types created to ensure termination of the algorithm.
package main
import "reflect"
import "unsafe"
var a, b int
var unknown bool
func reflectIndirect() {
	ptr := &a
	print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int))  
	print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0])  
}
func reflectNewAt() {
	var x [8]byte
	print(reflect.NewAt(reflect.TypeOf(3), unsafe.Pointer(&x)).Interface())  
}
func reflectTypeOf() {
	t := reflect.TypeOf(3)
	if unknown {
		t = reflect.TypeOf("foo")
	}
	print(t)                              
	print(reflect.Zero(t).Interface())    
	newint := reflect.New(t).Interface()  
	print(newint)                         
	print(newint.(*int))                  
	print(newint.(*string))               
}
func reflectTypeElem() {
	print(reflect.Zero(reflect.TypeOf(&a).Elem()).Interface())                        
	print(reflect.Zero(reflect.TypeOf([]string{}).Elem()).Interface())                
	print(reflect.Zero(reflect.TypeOf(make(chan bool)).Elem()).Interface())           
	print(reflect.Zero(reflect.TypeOf(make(map[string]float64)).Elem()).Interface())  
	print(reflect.Zero(reflect.TypeOf([3]complex64{}).Elem()).Interface())            
	print(reflect.Zero(reflect.TypeOf(3).Elem()).Interface())                         
	print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem()))                      
	print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem()).Interface())          
}
func metareflection() {
	v0 := reflect.ValueOf(&a)
	print(v0)                               
	v1 := reflect.ValueOf(v0)               
	print(v1)                               
	v2 := reflect.ValueOf(v1)               
	print(v2)                               
	v1a := v2.Interface().(reflect.Value)   
	print(v1a)                              
	v0a := v1a.Interface().(reflect.Value)  
	print(v0a)                              
	print(v0a.Interface().(*int))           
	var iface interface{} = 3
	x0 := reflect.ValueOf(&iface).Elem()
	print(x0)                               
	x1 := reflect.ValueOf(x0)               
	print(x1)                               
	x2 := reflect.ValueOf(x1)               
	print(x2)                               
	x1a := x2.Interface().(reflect.Value)   
	print(x1a)                              
	x0a := x1a.Interface().(reflect.Value)  
	print(x0a)                              
	print(x0a.Interface())                  
}
type T struct{}