1
2
3
4
5
6
7
8
9
10 package main
11
12 type T int
13
14 var nv, np int
15
16 func (t T) V() {
17 if t != 42 {
18 panic(t)
19 }
20 nv++
21 }
22
23 func (t *T) P() {
24 if *t != 42 {
25 println(t, *t)
26 panic("fail")
27 }
28 np++
29 }
30
31 type V interface {
32 V()
33 }
34 type P interface {
35 P()
36 V()
37 }
38
39 type S struct {
40 T
41 }
42
43 type SP struct {
44 *T
45 }
46
47 func main() {
48 var t T
49 var v V
50 var p P
51
52 t = 42
53
54 t.P()
55 t.V()
56
57 v = t
58 v.V()
59
60 p = &t
61 p.P()
62 p.V()
63
64 v = &t
65 v.V()
66
67
68 var i interface{} = t
69 if _, ok := i.(P); ok {
70 println("dynamic i.(P) succeeded incorrectly")
71 panic("fail")
72 }
73
74
75 var s S
76 s.T = 42
77 s.P()
78 s.V()
79
80 v = s
81 s.V()
82
83 p = &s
84 p.P()
85 p.V()
86
87 v = &s
88 v.V()
89
90
91 var j interface{} = s
92 if _, ok := j.(P); ok {
93 println("dynamic j.(P) succeeded incorrectly")
94 panic("fail")
95 }
96
97
98 var sp SP
99 sp.T = &t
100 sp.P()
101 sp.V()
102
103 v = sp
104 sp.V()
105
106 p = &sp
107 p.P()
108 p.V()
109
110 v = &sp
111 v.V()
112
113 p = sp
114 p.P()
115 p.V()
116
117 if nv != 13 || np != 7 {
118 println("bad count", nv, np)
119 panic("fail")
120 }
121 }
122
View as plain text