Выбор ответа 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.
Варианты ответа
- Интерфейс нужно явно реализовать словом implements у Dog
- У Dog нет полей, а пустая структура не реализует интерфейсы
Speakобъявлен на*Dog, в набор методовDogон не входитправильный ответ- Методы нельзя объявлять на указателях, только на значениях
Разбор
Набор методов T содержит только методы с ресивером T, а набор *T содержит методы и T, и *T. Значение Dog{} в интерфейс положить нельзя, а &Dog{} можно. Причина: значение в интерфейсе неадресуемо, и Go не может взять его адрес для вызова pointer-метода. implements в Go нет, поля не нужны, методы на указателях обычное дело.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: интерфейс хранит копию значения
- Что выведет Go: method value и defer копируют ресивер
- Что выведет Go: nil-указатель в интерфейсе error