Метод на значении / указателе в Go

Все знают, что когда метод определен на значении, его можно вызвать на указателе:

type Cat struct{}
func (c Cat) Meow() {}

val := Cat{}
val.Meow()

ptr := &Cat{}
ptr.Meow()

песочница

И наоборот:

type Cat struct{}
func (c *Cat) Meow() {}

val := Cat{}
val.Meow()

ptr := &Cat{}
ptr.Meow()

песочница

Дело усложняется, когда переменная имеет не конкретный тип, а интерфейсный.

Работает почти всегда, кроме одной ситуации: метод определен на указателе, а интерфейсная переменная содержит значение:

type Meower interface {
    Meow()
}

type Cat struct{}
func (c *Cat) Meow() {}

var ival Meower
ival = Cat{}

Здесь будет ошибка:

Cat does not implement Meower (method Meow has pointer receiver)

Документация: Method sets

★ Подписывайтесь на новые заметки.