<i>That&#x27;s called using opaque pointers. It&#x27;s pretty much what you do in C.</i><p>???<p>The empty interface is effectively dynamic typing, relying on runtime introspection. It does not hide any struct members (unless you make them private), you can simply enumerate them.<p>Opaque pointers in C provide a way to enforce static typing without exposing struct members and are effectively a method for information hiding.<p>So, I am wondering why you said that.<p><i>My other pet peeve is that a method with a non-pointer receiver that tries to modify the receiver object will silently drop those modifications on the ground, because the object is copied.</i><p>I agree. In fact, it is seldom that I actually want the non-pointer variant. If I don&#x27;t modify the object, just give me a const modifier so that I can indicate that.<p>(Or reasoned from outside Go: the receiver should IMO always be passed by reference.)