diff options
author | Johan Euphrosine <proppy@google.com> | 2012-03-01 10:05:51 +1100 |
---|---|---|
committer | Johan Euphrosine <proppy@google.com> | 2012-03-01 10:05:51 +1100 |
commit | 6c02fe030139f3059012bdf9424fd0ae789bb9cc (patch) | |
tree | c4308d72adb8fa69022735141df6d860cd5fbb06 /doc/progs | |
parent | 6085c260b30a617e781f77163c5f8a4ad9505db0 (diff) | |
download | go-6c02fe030139f3059012bdf9424fd0ae789bb9cc.tar.gz |
doc: add The Laws of Reflection article
Originally published on The Go Programming Language Blog, September 6, 2011.
http://blog.golang.org/2011/09/laws-of-reflection.html
Update issue 2547
R=golang-dev, r, adg
CC=golang-dev
http://codereview.appspot.com/5689054
Committer: Andrew Gerrand <adg@golang.org>
Diffstat (limited to 'doc/progs')
-rw-r--r-- | doc/progs/interface.go | 56 | ||||
-rw-r--r-- | doc/progs/interface2.go | 112 |
2 files changed, 168 insertions, 0 deletions
diff --git a/doc/progs/interface.go b/doc/progs/interface.go new file mode 100644 index 000000000..91145401e --- /dev/null +++ b/doc/progs/interface.go @@ -0,0 +1,56 @@ +package main + +import ( + "bufio" + "bytes" + "io" + "os" +) + +type MyInt int + +var i int +var j MyInt + +// STOP OMIT + +// Reader is the interface that wraps the basic Read method. +type Reader interface { + Read(p []byte) (n int, err error) +} + +// Writer is the interface that wraps the basic Write method. +type Writer interface { + Write(p []byte) (n int, err error) +} + +// STOP OMIT + +func readers() { // OMIT + var r io.Reader + r = os.Stdin + r = bufio.NewReader(r) + r = new(bytes.Buffer) + // and so on + // STOP OMIT +} + +func typeAssertions() (interface{}, error) { // OMIT + var r io.Reader + tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) + if err != nil { + return nil, err + } + r = tty + // STOP OMIT + var w io.Writer + w = r.(io.Writer) + // STOP OMIT + var empty interface{} + empty = w + // STOP OMIT + return empty, err +} + +func main() { +} diff --git a/doc/progs/interface2.go b/doc/progs/interface2.go new file mode 100644 index 000000000..e2716cf16 --- /dev/null +++ b/doc/progs/interface2.go @@ -0,0 +1,112 @@ +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) + // START f3b OMIT + y := v.Interface().(float64) // y will have type float64. + fmt.Println(y) + // START f3c OMIT + fmt.Println(v.Interface()) + // 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) + // 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()) + // START f7b OMIT + v := p.Elem() + fmt.Println("settability of v:", v.CanSet()) + // 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()) + } + // START f8b OMIT + s.Field(0).SetInt(77) + s.Field(1).SetString("Sunset Strip") + fmt.Println("t is now", t) + // STOP OMIT +} |