Open
Description
An interface is a collection of method names and signatures. Say, we have: package a type Writer interface { Write([]byte) (int, error) } type WriterTo interface { WriteTo(Writer) (int64, error) } type WriterTo2 interface { WriteTo(w interface{Write([]byte) (int, error)} (int64, error) } From the perspective of the one writing an implementation, the a.Writer and io.Writer are the same: As long as the Write method has the right signature they are both fulfilled. However a.WriterTo and io.WriterTo are not, simply because they refer to Writers of different packages although they have the same definition. Even WriterTo2 would only be compatible with io.WriterTo if they later had an anonymous interface too. see http://play.golang.org/p/kOH11TOlsE Since interfaces are all about reusable code this behaviour must be considered an artifact of the way, interfaces are represented and treated during compilation. Since interfaces have no methods and no values, their only value is to help the programmers via the type constraints. From the implementation perspective a.WriterTo, io.WriterTo and a.WriterTo2 must be treated as being the same, a contraint to have a method WriteTo(w interface{Write([]byte) (int, error)} (int64, error). The names (and packages) of the interfaces should not be relevant for the compiler. Instead the definition should be the representation and the names just shortcuts to refer to them.