Интерфейс в Go — это набор сигнатур методов (абстрактное поведение), который определяет контракт для типов. Любой тип, реализующий все методы интерфейса, автоматически удовлетворяет этому интерфейсу (утиная типизация).
type Writer interface {
Write([]byte) (int, error)
}
type File struct{}
func (f File) Write(data []byte) (int, error) {
return len(data), nil
}
func main() {
var w Writer = File{} // File неявно реализует Writer
w.Write([]byte("hello"))
}
interface{}
(аналог any
в Go 1.18+): Может хранить любое значениеХарактеристика | Go | Java |
---|---|---|
Объявление | Только методы | Методы + константы + дефолтные методы |
Реализация | Неявная (автоматическая) | Явная (через implements ) |
Наследование | Нет, только композиция | Есть (extends ) |
Дефолтные методы | Нет | Есть (с Java 8) |
Поля | Не поддерживаются | Поддерживаются |
Пустой интерфейс | interface{} /any |
Object |
Go (неявная реализация):
type Speaker interface { Speak() string }
type Dog struct{}
func (d Dog) Speak() string { return "Гав!" }
func MakeSound(s Speaker) { fmt.Println(s.Speak()) }
func main() {
MakeSound(Dog{}) // Работает без явного указания
}
Java (явная реализация):
interface Speaker { String speak(); }
class Dog implements Speaker { // Явное указание
public String speak() { return "Гав!"; }
}
public class Main {
static void makeSound(Speaker s) {
System.out.println(s.speak());
}
public static void main(String[] args) {
makeSound(new Dog());
}
}
var val interface{} = "hello"
str, ok := val.(string) // ok = true
switch v := val.(type) {
case int:
fmt.Printf("Число: %d", v)
case string:
fmt.Printf("Строка: %s", v)
}
error
(интерфейс с методом Error() string
)io.Reader
/io.Writer
(для работы с I/O)Интерфейсы Go — это минималистичный, но мощный инструмент для полиморфизма. В отличие от Java, они не требуют явной декларации связей, что делает код гибче, но требует дисциплины при проектировании. Главное преимущество — простота интеграции и утиная типизация ("Если что-то крякает как утка — это утка").