...
1 package main
2
3
4
5 type A struct {
6 x int
7 y *int
8 }
9
10 type B struct {
11 p int
12 q *int
13 }
14
15 type C struct {
16 A
17 *B
18 }
19
20 type D struct {
21 a int
22 C
23 }
24
25 func assert(cond bool) {
26 if !cond {
27 panic("failed")
28 }
29 }
30
31 func f1(c C) {
32 assert(c.x == c.A.x)
33 assert(c.y == c.A.y)
34 assert(&c.x == &c.A.x)
35 assert(&c.y == &c.A.y)
36
37 assert(c.p == c.B.p)
38 assert(c.q == c.B.q)
39 assert(&c.p == &c.B.p)
40 assert(&c.q == &c.B.q)
41
42 c.x = 1
43 *c.y = 1
44 c.p = 1
45 *c.q = 1
46 }
47
48 func f2(c *C) {
49 assert(c.x == c.A.x)
50 assert(c.y == c.A.y)
51 assert(&c.x == &c.A.x)
52 assert(&c.y == &c.A.y)
53
54 assert(c.p == c.B.p)
55 assert(c.q == c.B.q)
56 assert(&c.p == &c.B.p)
57 assert(&c.q == &c.B.q)
58
59 c.x = 1
60 *c.y = 1
61 c.p = 1
62 *c.q = 1
63 }
64
65 func f3(d D) {
66 assert(d.x == d.C.A.x)
67 assert(d.y == d.C.A.y)
68 assert(&d.x == &d.C.A.x)
69 assert(&d.y == &d.C.A.y)
70
71 assert(d.p == d.C.B.p)
72 assert(d.q == d.C.B.q)
73 assert(&d.p == &d.C.B.p)
74 assert(&d.q == &d.C.B.q)
75
76 d.x = 1
77 *d.y = 1
78 d.p = 1
79 *d.q = 1
80 }
81
82 func f4(d *D) {
83 assert(d.x == d.C.A.x)
84 assert(d.y == d.C.A.y)
85 assert(&d.x == &d.C.A.x)
86 assert(&d.y == &d.C.A.y)
87
88 assert(d.p == d.C.B.p)
89 assert(d.q == d.C.B.q)
90 assert(&d.p == &d.C.B.p)
91 assert(&d.q == &d.C.B.q)
92
93 d.x = 1
94 *d.y = 1
95 d.p = 1
96 *d.q = 1
97 }
98
99 func main() {
100 y := 123
101 c := C{
102 A{x: 42, y: &y},
103 &B{p: 42, q: &y},
104 }
105
106 assert(&c.x == &c.A.x)
107
108 f1(c)
109 f2(&c)
110
111 d := D{C: c}
112 f3(d)
113 f4(&d)
114 }
115
View as plain text