Несколько методов интерфейса в Go
Если в интерфейсе несколько методов, у типа должны быть все. Компилятор проверяет полный список: одного совпадения по имени недостаточно, нужны те же параметры и результаты у каждого метода из описания интерфейса.
Сделаем тип с чтением и записью текста:
package main
import "fmt"
type ReadWriter interface {
Read() string
Write(string)
}
type Buffer struct {
data string
}
func (b Buffer) Read() string {
return b.data
}
func (b *Buffer) Write(text string) {
b.data = text
}
func main() {
b := &Buffer{data: "start"}
var rw ReadWriter = b
fmt.Println(rw.Read())
}
У указателя на Buffer есть оба метода,
поэтому присваивание в ReadWriter
собралось. Если у типа не хватает одного
метода из списка, такой код не собирается:
package main
type ReadWriter interface {
Read() string
Write(string)
}
type ReaderOnly struct {
data string
}
func (r ReaderOnly) Read() string {
return r.data
}
func main() {
var rw ReadWriter = ReaderOnly{data: "x"}
}
У ReaderOnly есть только Read,
метода Write нет, и переменная
ReadWriter такое значение не примет.
Дан интерфейс:
package main
type Closer interface {
Open()
Close()
}
Запишите структуру File с полем
name и оба метода с получателем-значением,
положите значение в Closer.
Дан следующий код:
package main
type Pair interface {
First() int
Second() int
}
type One struct {
v int
}
func (o One) First() int {
return o.v
}
Скажите, соберется ли var p Pair = One{v: 1}.
Добавьте ко второму примеру урока метод
Write с получателем-указателем и
скажите, изменится ли вывод при том же
присваивании в ReadWriter.