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