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