Метод на значении / указателе в 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
★ Подписывайтесь на новые заметки.