| package p |
| |
| // old |
| type S1 struct { |
| A int |
| B string |
| C bool |
| d float32 |
| } |
| |
| // new |
| type S1 = s1 |
| |
| type s1 struct { |
| C chan int |
| // i S1.C: changed from bool to chan int |
| A int |
| // i S1.B: removed |
| // i S1: old is comparable, new is not |
| x []int |
| d float32 |
| E bool |
| // c S1.E: added |
| } |
| |
| // old |
| type embed struct { |
| E string |
| } |
| |
| type S2 struct { |
| A int |
| embed |
| } |
| |
| // new |
| type embedx struct { |
| E string |
| } |
| |
| type S2 struct { |
| embedx // OK: the unexported embedded field changed names, but the exported field didn't |
| A int |
| } |
| |
| // both |
| type F int |
| |
| // old |
| type S3 struct { |
| A int |
| embed |
| } |
| |
| // new |
| type embed struct{ F int } |
| |
| type S3 struct { |
| // i S3.E: removed |
| embed |
| // c S3.F: added |
| A int |
| } |
| |
| // both |
| type A1 [1]int |
| |
| // old |
| type embed2 struct { |
| embed3 |
| F // shadows embed3.F |
| } |
| |
| type embed3 struct { |
| F bool |
| } |
| |
| type alias = struct{ D bool } |
| |
| type S4 struct { |
| int |
| *embed2 |
| embed |
| E int // shadows embed.E |
| alias |
| A1 |
| *S4 |
| } |
| |
| // new |
| type S4 struct { |
| // OK: removed unexported fields |
| // D and F marked as added because they are now part of the immediate fields |
| D bool |
| // c S4.D: added |
| E int // OK: same as in old |
| F F |
| // c S4.F: added |
| A1 // OK: same |
| *S4 // OK: same (recursive embedding) |
| } |
| |
| // Difference between exported selectable fields and exported immediate fields. |
| // both |
| type S5 struct{ A int } |
| |
| // old |
| // Exported immediate fields: A, S5 |
| // Exported selectable fields: A int, S5 S5 |
| type S6 struct { |
| S5 S5 |
| A int |
| } |
| |
| // new |
| // Exported immediate fields: S5 |
| // Exported selectable fields: A int, S5 S5. |
| |
| // i S6.A: removed |
| type S6 struct { |
| S5 |
| } |
| |
| // Ambiguous fields can exist; they just can't be selected. |
| // both |
| type ( |
| embed7a struct{ E int } |
| embed7b struct{ E bool } |
| ) |
| |
| // old |
| type S7 struct { // legal, but no selectable fields |
| embed7a |
| embed7b |
| } |
| |
| // new |
| type S7 struct { |
| embed7a |
| embed7b |
| // c S7.E: added |
| E string |
| } |