Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpIfSM 28 of 280 menu
◀ ▶

Несколько методов интерфейса в 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить