Выбор ответа Middle Структуры, методы и интерфейсы спрашивают часто обновлено

Набор методов и реализация интерфейса

Вопрос

Почему код не компилируется?

type Speaker interface{ Speak() string }
type Dog struct{}

func (d *Dog) Speak() string { return "гав" }

var s Speaker = Dog{}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Speak объявлен на Dog, в набор методов Dog он не входит. Набор методов T содержит только методы с ресивером T, а набор T содержит методы и T, и T.

Варианты ответа

  1. Интерфейс нужно явно реализовать словом implements у Dog
  2. У Dog нет полей, а пустая структура не реализует интерфейсы
  3. Speak объявлен на *Dog, в набор методов Dog он не входитправильный ответ
  4. Методы нельзя объявлять на указателях, только на значениях

Разбор

Набор методов T содержит только методы с ресивером T, а набор *T содержит методы и T, и *T. Значение Dog{} в интерфейс положить нельзя, а &Dog{} можно. Причина: значение в интерфейсе неадресуемо, и Go не может взять его адрес для вызова pointer-метода. implements в Go нет, поля не нужны, методы на указателях обычное дело.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.