danforth: прочитайте последнюю ссылку в моём ответе. Компилер будет рерайтить только в случае, если переменная ADDRESSABLE. То есть, например, стурктура, слайс и т.д. Если переменная типа interface, а он не addressable, поэтому компилер не рерайтит на (&b).
fmt, очевидно, ничего не знает про ваши типы, а все передаваемые ему аргументы типа Stringer, то есть - интерфейсы. Это как раз тот момент, когда ваша переменная из адресуемого типа IPAddr превращается в неадресуемый interface Stringer.
danforth: копирование будет в любом случае. Если вы вызываете с указателем, то скопируется только указатель, который будет указывать на ту же область памяти что и оригинальный указатель и вы сможете её поменять. Иначе же скопируется вся структура. Так передаются аргументы (ресивер метода - тоже аргумент).
Далее. Вы действительно привели хороший пример с методами на структуре. Вот я его визуализировал: https://play.golang.org/p/fl8hzKYXUQ
Получается, что в обе стороны работает для методов на структуре, а для функций интерфейса - только в одну. Почему так?
Мне самому пришлось открывать Effective Go уже в какой раз (в нём есть ответы на все вопросы).
Вот прямо ваш случай там и описан: https://golang.org/doc/effective_go.html#pointers_...
Ответ в слове Addressable.
`The rule about pointers vs. values for receivers is that value methods can be invoked on pointers and values, but pointer methods can only be invoked on pointers.`
...
`There is a handy exception, though. When the value is addressable, the language takes care of the common case of invoking a pointer method on a value by inserting the address operator automatically. In our example, the variable b is addressable, so we can call its Write method with just b.Write. The compiler will rewrite that to (&b).Write for us.`
danforth: изменил ответ, прочитайте, если что-то непонятно, могу дополнить. Да, в Golang реализация интерфейсов НЕявная. То есть тип может считаться реализующим интерфейс, когда реализовал ВСЕ его методы. Более того, этот же тип будет автоматом реализовывать все интерфейсы, являющиеся подмножествами текущего.
dom1n1k: я думаю большинству тех, кто в IT такой вариант был бы предпочтительнее. Но вы же понимаете, кто в аудитории у автора, им абсолютно пофигу какая реклама показывается, а вот лишние окна сразу расцениваются как вирусы.