2019-10-07 16:45:07 +03:00

64 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// _Интерфейсы_ это коллекции методов.
package main
import (
"fmt"
"math"
)
// Пример базового интерфейса в Go
type geometry interface {
area() float64
perim() float64
}
// В нашем примере мы будем реализовывать этот интерфейс
// для типов `rect` и `circle`.
type rect struct {
width, height float64
}
type circle struct {
radius float64
}
// Чтобы реализовать интерфейс на Go, нам просто нужно
// реализовать все методы в интерфейсе. Здесь мы
// реализуем интерфейс `geometry` для `rect`.
func (r rect) area() float64 {
return r.width * r.height
}
func (r rect) perim() float64 {
return 2*r.width + 2*r.height
}
// Реализация для `circle`.
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
return 2 * math.Pi * c.radius
}
// Если переменная реализует интерфейс, то мы можем
// вызывать методы, которые находятся в этом интерфейсе.
// Функция `measure` использует это преимущество, для
// работы с любой фигурой.
func measure(g geometry) {
fmt.Println(g)
fmt.Println(g.area())
fmt.Println(g.perim())
}
func main() {
r := rect{width: 3, height: 4}
c := circle{radius: 5}
// Типы `circle` и `rect` структур реализуют
// интерфейс `geometry`, поэтому мы можем использовать
// экземпляры этих структур в качестве аргументов для
// `measure`.
measure(r)
measure(c)
}