Объявление интерфейса interface
Объявление интерфейса в Go задает контракт, который определяет набор методов.
Тип реализует интерфейс, если он реализует все методы, объявленные в интерфейсе.
В первом параметре указывается имя интерфейса, а в теле перечисляются сигнатуры методов
без ключевого слова func и без тела.
Синтаксис
type InterfaceName interface {
Method1(param1 Type1) ReturnType1
Method2(param2 Type2) ReturnType2
}
Пример
Давайте объявим интерфейс Stringer
с одним методом String() string:
package main
import "fmt"
type Stringer interface {
String() string
}
type Book struct {
Title string
Author string
}
func (b Book) String() string {
return b.Title + " by " + b.Author
}
func main() {
b := Book{"The Go Programming Language", "Donovan & Kernighan"}
fmt.Println(b.String())
}
Результат выполнения кода:
"The Go Programming Language by Donovan & Kernighan"
Пример
Давайте объявим интерфейс Processor
с двумя методами Process() int и
Reset():
package main
import "fmt"
type Processor interface {
Process(data int) int
Reset()
}
type Multiplier struct {
factor int
}
func (m *Multiplier) Process(data int) int {
return data * m.factor
}
func (m *Multiplier) Reset() {
m.factor = 1
}
func main() {
var p Processor = &Multiplier{factor: 5}
res := p.Process(10)
fmt.Println(res)
p.Reset()
res = p.Process(10)
fmt.Println(res)
}
Результат выполнения кода:
50
10
Пример
Давайте объявим интерфейс Checker
с методом Check() bool и
используем его для проверки чисел:
package main
import "fmt"
type Checker interface {
Check() bool
}
type EvenNumber struct {
Value int
}
func (e EvenNumber) Check() bool {
return e.Value%2 == 0
}
type PositiveNumber struct {
Value int
}
func (p PositiveNumber) Check() bool {
return p.Value > 0
}
func main() {
checkers := []Checker{EvenNumber{4}, PositiveNumber{-3}}
for _, checker := range checkers {
fmt.Println(checker.Check())
}
}
Результат выполнения кода:
true
false
Смотрите также
-
понятие
реализации интерфейса,
которая определяет, как тип удовлетворяет интерфейсу -
понятие
неявной реализации,
которая позволяет реализовать интерфейс без явного указания -
понятие
методов интерфейса,
которые определяют поведение типов -
понятие
встраивания интерфейсов,
которое позволяет комбинировать несколько интерфейсов