savo.la
2019-11-23
Go trick: obscure embedded field
type P struct { X int Y int } type C struct { P Z int } func main() { var c C _ = c.Z _ = c.Y _ = c.X }
Because P is embedded into C anonymously, its fields are directly accessible. If access to an inherited field should be discouraged, direct access to it can be prevented like this:
type blocker struct { X struct{} } type P struct { X int Y int } type C struct { P Z int blocker } func main() { var c C _ = c.Z _ = c.Y _ = c.X // Error: ambiguous selector. _ = c.P.X // Still works. }
Unfortunately, the size of C is increased, even if the embedded struct is empty.