...
1 package main
2
3
4
5 type A struct{ magic int }
6
7 func (a A) x() {
8 if a.magic != 1 {
9 panic(a.magic)
10 }
11 }
12 func (a *A) y() *A {
13 return a
14 }
15
16 type B struct{ magic int }
17
18 func (b B) p() {
19 if b.magic != 2 {
20 panic(b.magic)
21 }
22 }
23 func (b *B) q() {
24 if b != theC.B {
25 panic("oops")
26 }
27 }
28
29 type I interface {
30 f()
31 }
32
33 type impl struct{ magic int }
34
35 func (i impl) f() {
36 if i.magic != 3 {
37 panic("oops")
38 }
39 }
40
41 type C struct {
42 A
43 *B
44 I
45 }
46
47 func assert(cond bool) {
48 if !cond {
49 panic("failed")
50 }
51 }
52
53 var theC = C{
54 A: A{1},
55 B: &B{2},
56 I: impl{3},
57 }
58
59 func addr() *C {
60 return &theC
61 }
62
63 func value() C {
64 return theC
65 }
66
67 func main() {
68
69 addr().x()
70 if addr().y() != &theC.A {
71 panic("oops")
72 }
73 addr().p()
74 addr().q()
75 addr().f()
76
77
78 var c C = value()
79 c.x()
80 if c.y() != &c.A {
81 panic("oops")
82 }
83 c.p()
84 c.q()
85 c.f()
86
87
88 value().x()
89
90 value().p()
91 value().q()
92 value().f()
93 }
94
View as plain text