Интерфейс задаёт необходимое поведение
Функции удобнее зависеть от действия, которое ей нужно, чем от конкретного типа. Тип реализует интерфейс автоматически, если у него есть требуемые методы.
package main
import "fmt"
type Priced interface {
DeliveryPrice() int
}
type Route struct{ Distance int }
type Envelope struct{ Route }
func (e Envelope) DeliveryPrice() int { return 100 + e.Distance*2 }
type Box struct {
Route
Weight int
}
func (b Box) DeliveryPrice() int { return 200 + b.Distance*2 + b.Weight*10 }
func printPrice(item Priced) {
fmt.Println(item.DeliveryPrice())
}
func main() {
printPrice(Envelope{Route: Route{Distance: 5}})
printPrice(Box{Route: Route{Distance: 5}, Weight: 3})
}
Интерфейс описывает набор методов, нужных потребителю. Реализация не требует ключевого слова: достаточно определить эти методы. Встраивание типа помогает собирать поведение из небольших частей.