Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Интерфейсы
- Тип данных, ожидаемый функцией, должен быть указан в параметрах функции
- | Не всегда можно заранее знать тип данных
- | Интерфейсы позволяют указывать поведение типа, а не сам тип
- Это позволяет функциям работать с разными типами данных
- ->Интерфейсы реализуются неявно
- Когда тип имеет все функции приёмника, необходимые для интерфейса, он считается реализованным
- -> !!! Функции, работающие с интерфейсами, не должны принимать указатель на интерфейс
- Вызывающая сторона определяет, будет ли использован указатель или значение (копия)
- Рекомендуется использовать несколько интерфейсов с небольшим количеством функций, чем один большой интерфейс
- =========================================================
- Создание и реализация
- type Mylnterface interface {
- Function1()
- Function2(x int) int
- }
- type MyType int func (m MyType)
- func (m MyType) Function1() {}
- func (m MyType) Function2(x int) int { return x + x}
- !!!!! ВАЖНО !!!! принимать переменные по значению на вызывающей стороне
- можно будет определить передать в функцию копию значения или его оригинал (указатель)
- РАБОТАЕТ ТОЛЬКО ДЛЯ ИНТЕРФЕЙСА!!!!
- execute(i Mylnterface) {
- i.Function1()
- }
- m:= MyType(1)
- Вызывающая сторона определяет передать значение:
- execute(m)
- или указатель:
- execute(&m)
- ЕСЛИ МЫ ДЕЛАЕМ ПРИЕМ MyType в одной функции интерфейса по указателю, то и для всех остальных
- тоже следует делать по указателю..
- type MyType int func (m MyType)
- func (m *MyType) Function1() {}
- func (m *MyType) Function2(x int) int { return x + x}
- ИЛИ ЕСЛИ ПО ЗНАЧЕНИЮ, ТО И ВСЕ ПРО ЗНАЧЕНИЮ:
- type MyType int func (m MyType)
- func (m MyType) Function1() {}
- func (m MyType) Function2(x int) int { return x + x}
- ==============================================================================================
- type Resetter interface {
- Reset()
- }
- type Coord struct {
- x int
- y int
- }
- type Player struct {
- health int
- position Coord
- }
- func (p *Player) Reset() {
- p.health = 100
- p.position = Coord{0, 0}
- }
- func Reset(r Resetter) {
- r.Reset()
- }
- func Plres() {
- player := Player{50, Coord{5, 5}}
- fmt.Println(player)
- Reset(&player)
- fmt.Println(player)
- }
- //Иногда необходимо получить доступ к базовому типу, который реализует интерфейс
- //Вызывайте функции, вносите изменения и т.д.
- func ResetWithPenalty(r Resetter) {
- //Если тип реализатора Resetter это Player
- if player, ok := r.(*Player); ok {
- player.health = 50
- } else {
- r.Reset()
- }
- }
Add Comment
Please, Sign In to add comment