Назад к вопросам
Junior
150
questionbank
Как сообщить компилятору, что наш тип реализует интерфейс?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Go реализация интерфейса неявная. Компилятору достаточно, чтобы тип имел все методы, объявленные в интерфейсе, с совпадающей сигнатурой.
Пример:
package main
import "fmt"
// Интерфейс Shape имеет один метод Area
type Shape interface {
Area() float64
}
// Структура Circle
type Circle struct {
Radius float64
}
// Метод Area для типа Circle
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
// Структура Rectangle
type Rectangle struct {
Width, Height float64
}
// Метод Area для типа Rectangle
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func main() {
// Circle и Rectangle неявно реализуют интерфейс Shape,
// поскольку у них есть метод Area() float64
var s Shape
s = Circle{Radius: 5} // Присваивание экземпляра Circle переменной типа Shape
fmt.Printf("Area of circle: %f\n", s.Area())
s = Rectangle{Width: 4, Height: 6} // Присваивание экземпляра Rectangle переменной типа Shape
fmt.Printf("Area of rectangle: %f\n", s.Area())
}
Иногда для явной проверки реализации на этапе компиляции используется конструкция var _ InterfaceType = ConcreteType{}. Если ConcreteType не реализует InterfaceType, компилятор выдаст ошибку.
// Проверка реализации интерфейса Shape типом Circle на этапе компиляции
var _ Shape = Circle{}
// Проверка реализации интерфейса Shape типом Rectangle на этапе компиляции
var _ Shape = Rectangle{}