Вопрос проверяет понимание уникальной модели интерфейсов в Go, основанной на неявной реализации, в отличие от явной в Java/C#.
В Go интерфейсы реализуются неявно. Это значит, что тип автоматически удовлетворяет интерфейсу, если он предоставляет все методы, объявленные в интерфейсе. Вам не нужно писать implements или наследоваться от интерфейса. В Java или C# реализация всегда явная: класс должен объявить implements InterfaceName.
package main
import "fmt"
// Определяем интерфейс
type Speaker interface {
Speak() string
}
// Структура Dog не знает об интерфейсе
type Dog struct{}
func (d Dog) Speak() string {
return "Woof!"
}
// Структура Cat тоже
type Cat struct{}
func (c Cat) Speak() string {
return "Meow!"
}
func main() {
var s Speaker
s = Dog{}
fmt.Println(s.Speak()) // Woof!
s = Cat{}
fmt.Println(s.Speak()) // Meow!
}Обратите внимание: ни Dog, ни Cat не объявляют, что реализуют Speaker. Компилятор проверяет это автоматически при присваивании.
// Java — явная реализация
interface Speaker {
String speak();
}
class Dog implements Speaker {
@Override
public String speak() {
return "Woof!";
}
}В Java без implements Speaker код не скомпилируется, даже если методы совпадают.
implements для каждого интерфейса.Неявная реализация интерфейсов в Go — это мощный инструмент для создания гибких и слабосвязанных систем. Она особенно полезна в микросервисной архитектуре и при работе с абстракциями, где важна возможность легко подменять реализации без изменения существующего кода.