// cmpout

// 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.

// This file contains the code snippets included in "The Laws of Reflection."

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var x float64 = 3.4
	fmt.Println("type:", reflect.TypeOf(x))
	// STOP OMIT
	// TODO(proppy): test output OMIT
}

// STOP main OMIT

func f1() {
	// START f1 OMIT
	var x float64 = 3.4
	v := reflect.ValueOf(x)
	fmt.Println("type:", v.Type())
	fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
	fmt.Println("value:", v.Float())
	// STOP OMIT
}

func f2() {
	// START f2 OMIT
	var x uint8 = 'x'
	v := reflect.ValueOf(x)
	fmt.Println("type:", v.Type())                            // uint8.
	fmt.Println("kind is uint8: ", v.Kind() == reflect.Uint8) // true.
	x = uint8(v.Uint())                                       // v.Uint returns a uint64.
	// STOP OMIT
}

func f3() {
	// START f3 OMIT
	type MyInt int
	var x MyInt = 7
	v := reflect.ValueOf(x)
	// STOP OMIT
	// START f3b OMIT
	y := v.Interface().(float64) // y will have type float64.
	fmt.Println(y)
	// STOP OMIT
	// START f3c OMIT
	fmt.Println(v.Interface())
	// STOP OMIT
	// START f3d OMIT
	fmt.Printf("value is %7.1e\n", v.Interface())
	// STOP OMIT
}

func f4() {
	// START f4 OMIT
	var x float64 = 3.4
	v := reflect.ValueOf(x)
	v.SetFloat(7.1) // Error: will panic.
	// STOP OMIT
}

func f5() {
	// START f5 OMIT
	var x float64 = 3.4
	v := reflect.ValueOf(x)
	fmt.Println("settability of v:", v.CanSet())
	// STOP OMIT
}

func f6() {
	// START f6 OMIT
	var x float64 = 3.4
	v := reflect.ValueOf(x)
	// STOP OMIT
	// START f6b OMIT
	v.SetFloat(7.1)
	// STOP OMIT
}

func f7() {
	// START f7 OMIT
	var x float64 = 3.4
	p := reflect.ValueOf(&x) // Note: take the address of x.
	fmt.Println("type of p:", p.Type())
	fmt.Println("settability of p:", p.CanSet())
	// STOP OMIT
	// START f7b OMIT
	v := p.Elem()
	fmt.Println("settability of v:", v.CanSet())
	// STOP OMIT
	// START f7c OMIT
	v.SetFloat(7.1)
	fmt.Println(v.Interface())
	fmt.Println(x)
	// STOP OMIT
}

func f8() {
	// START f8 OMIT
	type T struct {
		A int
		B string
	}
	t := T{23, "skidoo"}
	s := reflect.ValueOf(&t).Elem()
	typeOfT := s.Type()
	for i := 0; i < s.NumField(); i++ {
		f := s.Field(i)
		fmt.Printf("%d: %s %s = %v\n", i,
			typeOfT.Field(i).Name, f.Type(), f.Interface())
	}
	// STOP OMIT
	// START f8b OMIT
	s.Field(0).SetInt(77)
	s.Field(1).SetString("Sunset Strip")
	fmt.Println("t is now", t)
	// STOP OMIT
}

func f9() {
	// START f9 OMIT
	var x float64 = 3.4
	fmt.Println("value:", reflect.ValueOf(x))
	// STOP OMIT
}
