Наборы методов для T и *T

В спецификации языка Golang говорится:

Набор методов любого другого типа T состоит из всех методов с типом получателя T. Набор методов соответствующего типа указателя *T представляет собой набор всех методов с получателем *T или T (то есть он также содержит набор методов T).

Почему это? Почему методы, получающие T, относятся к методу, установленному для *T, а не наоборот?


person Matt Joiner    schedule 20.05.2012    source источник


Ответы (1)


Из часто задаваемых вопросов:

Если значение интерфейса содержит указатель *T, вызов метода может получить значение путем разыменования указателя, но если значение интерфейса содержит значение T, у вызова метода нет полезного способа получить указатель.

Кстати, метод с указателем-получателем может изменить своего получателя, точно так же, как он может изменить параметр-указатель. Передача приемника без указателя в качестве приемника указателя (при условии, что это возможно) позволяет методу изменить его, чего не должно быть.

Рекомендуется использовать один согласованный тип приемника для всех методов одного типа и избегать смешивания указателя и прямого приемника. Также рекомендуется использовать приемник указателя для больших типов.

person Mostafa    schedule 20.05.2012
comment
Отличный авторитетный ответ. Ваше здоровье. - person Matt Joiner; 20.05.2012