// Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE.md file. package teststructs type InterfaceA interface { InterfaceA() } type ( StructA struct{ X string } // Equal method on value receiver StructB struct{ X string } // Equal method on pointer receiver StructC struct{ X string } // Equal method (with interface argument) on value receiver StructD struct{ X string } // Equal method (with interface argument) on pointer receiver StructE struct{ X string } // Equal method (with interface argument on value receiver) on pointer receiver StructF struct{ X string } // Equal method (with interface argument on pointer receiver) on value receiver // These embed the above types as a value. StructA1 struct { StructA X string } StructB1 struct { StructB X string } StructC1 struct { StructC X string } StructD1 struct { StructD X string } StructE1 struct { StructE X string } StructF1 struct { StructF X string } // These embed the above types as a pointer. StructA2 struct { *StructA X string } StructB2 struct { *StructB X string } StructC2 struct { *StructC X string } StructD2 struct { *StructD X string } StructE2 struct { *StructE X string } StructF2 struct { *StructF X string } StructNo struct{ X string } // Equal method (with interface argument) on non-satisfying receiver AssignA func() int AssignB struct{ A int } AssignC chan bool AssignD <-chan bool ) func (x StructA) Equal(y StructA) bool { return true } func (x *StructB) Equal(y *StructB) bool { return true } func (x StructC) Equal(y InterfaceA) bool { return true } func (x StructC) InterfaceA() {} func (x *StructD) Equal(y InterfaceA) bool { return true } func (x *StructD) InterfaceA() {} func (x *StructE) Equal(y InterfaceA) bool { return true } func (x StructE) InterfaceA() {} func (x StructF) Equal(y InterfaceA) bool { return true } func (x *StructF) InterfaceA() {} func (x StructNo) Equal(y InterfaceA) bool { return true } func (x AssignA) Equal(y func() int) bool { return true } func (x AssignB) Equal(y struct{ A int }) bool { return true } func (x AssignC) Equal(y chan bool) bool { return true } func (x AssignD) Equal(y <-chan bool) bool { return true } var _ = func( a StructA, b StructB, c StructC, d StructD, e StructE, f StructF, ap *StructA, bp *StructB, cp *StructC, dp *StructD, ep *StructE, fp *StructF, a1 StructA1, b1 StructB1, c1 StructC1, d1 StructD1, e1 StructE1, f1 StructF1, a2 StructA2, b2 StructB2, c2 StructC2, d2 StructD2, e2 StructE2, f2 StructF1, ) { a.Equal(a) b.Equal(&b) c.Equal(c) d.Equal(&d) e.Equal(e) f.Equal(&f) ap.Equal(*ap) bp.Equal(bp) cp.Equal(*cp) dp.Equal(dp) ep.Equal(*ep) fp.Equal(fp) a1.Equal(a1.StructA) b1.Equal(&b1.StructB) c1.Equal(c1) d1.Equal(&d1) e1.Equal(e1) f1.Equal(&f1) a2.Equal(*a2.StructA) b2.Equal(b2.StructB) c2.Equal(c2) d2.Equal(&d2) e2.Equal(e2) f2.Equal(&f2) } type ( privateStruct struct{ Public, private int } PublicStruct struct{ Public, private int } ParentStructA struct{ privateStruct } ParentStructB struct{ PublicStruct } ParentStructC struct { privateStruct Public, private int } ParentStructD struct { PublicStruct Public, private int } ParentStructE struct { privateStruct PublicStruct } ParentStructF struct { privateStruct PublicStruct Public, private int } ParentStructG struct { *privateStruct } ParentStructH struct { *PublicStruct } ParentStructI struct { *privateStruct *PublicStruct } ParentStructJ struct { *privateStruct *PublicStruct Public PublicStruct private privateStruct } ) func NewParentStructG() *ParentStructG { return &ParentStructG{new(privateStruct)} } func NewParentStructH() *ParentStructH { return &ParentStructH{new(PublicStruct)} } func NewParentStructI() *ParentStructI { return &ParentStructI{new(privateStruct), new(PublicStruct)} } func NewParentStructJ() *ParentStructJ { return &ParentStructJ{ privateStruct: new(privateStruct), PublicStruct: new(PublicStruct), } } func (s *privateStruct) SetPrivate(i int) { s.private = i } func (s *PublicStruct) SetPrivate(i int) { s.private = i } func (s *ParentStructC) SetPrivate(i int) { s.private = i } func (s *ParentStructD) SetPrivate(i int) { s.private = i } func (s *ParentStructF) SetPrivate(i int) { s.private = i } func (s *ParentStructA) PrivateStruct() *privateStruct { return &s.privateStruct } func (s *ParentStructC) PrivateStruct() *privateStruct { return &s.privateStruct } func (s *ParentStructE) PrivateStruct() *privateStruct { return &s.privateStruct } func (s *ParentStructF) PrivateStruct() *privateStruct { return &s.privateStruct } func (s *ParentStructG) PrivateStruct() *privateStruct { return s.privateStruct } func (s *ParentStructI) PrivateStruct() *privateStruct { return s.privateStruct } func (s *ParentStructJ) PrivateStruct() *privateStruct { return s.privateStruct } func (s *ParentStructJ) Private() *privateStruct { return &s.private }