Ответ
В Go разрешение методов происходит во время компиляции и строго привязано к типам. Компилятор ищет методы в следующем порядке:
- Сначала проверяет методы, объявленные для самого типа (value receiver)
- Затем проверяет методы, объявленные для указателя на тип (pointer receiver)
- Если метод не найден - ошибка компиляции
type MyStruct struct{}
func (m MyStruct) ValueMethod() {}
func (m *MyStruct) PtrMethod() {}
func main() {
var s MyStruct
s.ValueMethod() // OK
s.PtrMethod() // OK - неявное приведение к (*MyStruct)
var p *MyStruct
p.PtrMethod() // OK
p.ValueMethod() // OK - разыменование указателя
}
Важные нюансы:
- Интерфейсы проверяют наличие методов во время выполнения
- Встраивание (embedding) изменяет порядок поиска методов
- Методы для значения и указателя - это разные методы