I’d like to understand the reason behind it (from language design perspective).
When you define an interface, it does not specify wether the implementation uses pointer receiver or value receiver. In other words, these details are not part of the interface definition. But when you assign a concrete value to an interface typed variable, why does it care how it is implemented?
I think it has all to do with the fact that the definition of the interface can’t assume when you’ll have to modify the state of your object (so you need a pointer) or when you’ll leave it untouched (a reference is good for that). So that an interface can’t enforce that a pointer or reference is needed for the impementation to run correctly. I’m aware it can be cumbersome to discover by “accident” that a pointer is needed in place of a reference but I guess it’s the result of the “copy by default” design of the language that makes pointers the exception .