| // $G $D/$F.go && $L $F.$A && ./$A.out |
| |
| // Copyright 2009 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. |
| |
| // Implicit methods for embedded types. |
| // Mixed pointer and non-pointer receivers. |
| |
| package main |
| |
| type T int |
| var nv, np int |
| |
| func (t T) V() { |
| if t != 42 { |
| panic(t) |
| } |
| nv++ |
| } |
| |
| func (t *T) P() { |
| if *t != 42 { |
| panic(t, *t) |
| } |
| np++ |
| } |
| |
| type V interface { V() } |
| type P interface { P(); V() } |
| |
| type S struct { |
| T; |
| } |
| |
| type SP struct { |
| *T; |
| } |
| |
| func main() { |
| var t T; |
| var v V; |
| var p P; |
| |
| t = 42; |
| |
| t.P(); |
| t.V(); |
| |
| v = t; |
| v.V(); |
| |
| p = &t; |
| p.P(); |
| p.V(); |
| |
| v = &t; |
| v.V(); |
| |
| // p = t; // ERROR |
| var i interface{} = t; |
| if _, ok := i.(P); ok { |
| panicln("dynamic i.(P) succeeded incorrectly"); |
| } |
| |
| // println("--struct--"); |
| var s S; |
| s.T = 42; |
| s.P(); |
| s.V(); |
| |
| v = s; |
| s.V(); |
| |
| p = &s; |
| p.P(); |
| p.V(); |
| |
| v = &s; |
| v.V(); |
| |
| // p = s; // ERROR |
| var j interface{} = s; |
| if _, ok := j.(P); ok { |
| panicln("dynamic j.(P) succeeded incorrectly"); |
| } |
| |
| // println("--struct pointer--"); |
| var sp SP; |
| sp.T = &t; |
| sp.P(); |
| sp.V(); |
| |
| v = sp; |
| sp.V(); |
| |
| p = &sp; |
| p.P(); |
| p.V(); |
| |
| v = &sp; |
| v.V(); |
| |
| p = sp; // not error |
| p.P(); |
| p.V(); |
| |
| if nv != 13 || np != 7 { |
| panicln("bad count", nv, np) |
| } |
| } |
| |