Как происходит resolving методов в компиляторе

«Как происходит resolving методов в компиляторе» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go разрешение методов происходит во время компиляции и строго привязано к типам. Компилятор ищет методы в следующем порядке:

  1. Сначала проверяет методы, объявленные для самого типа (value receiver)
  2. Затем проверяет методы, объявленные для указателя на тип (pointer receiver)
  3. Если метод не найден - ошибка компиляции
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) изменяет порядок поиска методов
  • Методы для значения и указателя - это разные методы