AlexNovoross87

interfaces

May 12th, 2025
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.47 KB | None | 0 0
  1. Интерфейсы
  2. Тип данных, ожидаемый функцией, должен быть указан в параметрах функции
  3.  | Не всегда можно заранее знать тип данных
  4.  | Интерфейсы позволяют указывать поведение типа, а не сам тип
  5. Это позволяет функциям работать с разными типами данных
  6.  
  7. ->Интерфейсы реализуются неявно
  8.    Когда тип имеет все функции приёмника, необходимые для интерфейса, он считается реализованным
  9. -> !!! Функции, работающие с интерфейсами, не должны принимать указатель на интерфейс
  10.     Вызывающая сторона определяет, будет ли использован указатель или значение (копия)
  11.  Рекомендуется использовать несколько интерфейсов с небольшим количеством функций, чем один большой интерфейс
  12.  
  13.  
  14. =========================================================
  15. Создание и реализация
  16.  
  17. type Mylnterface interface {
  18. Function1()
  19. Function2(x int) int
  20. }
  21.  
  22. type MyType int func (m MyType)
  23. func (m MyType) Function1() {}
  24. func (m MyType) Function2(x int) int { return x + x}
  25.  
  26. !!!!! ВАЖНО !!!! принимать переменные по значению на вызывающей стороне
  27. можно будет определить передать в функцию копию значения или его оригинал (указатель)
  28. РАБОТАЕТ ТОЛЬКО ДЛЯ ИНТЕРФЕЙСА!!!!
  29.  
  30. execute(i Mylnterface) {
  31. i.Function1()
  32. }
  33.  
  34. m:= MyType(1)
  35. Вызывающая сторона определяет передать значение:
  36. execute(m)
  37. или указатель:
  38. execute(&m)
  39.  
  40.  
  41.  
  42. ЕСЛИ МЫ ДЕЛАЕМ ПРИЕМ MyType в одной функции интерфейса по указателю, то и для всех остальных
  43. тоже следует делать по указателю..
  44.  type MyType int func (m MyType)
  45.  func (m *MyType) Function1() {}
  46.  func (m *MyType) Function2(x int) int { return x + x}
  47.  
  48.  ИЛИ ЕСЛИ ПО ЗНАЧЕНИЮ, ТО И ВСЕ ПРО ЗНАЧЕНИЮ:
  49. type MyType int func (m MyType)
  50. func (m MyType) Function1() {}
  51. func (m MyType) Function2(x int) int { return x + x}
  52.  
  53.  
  54. ==============================================================================================
  55.  
  56. type Resetter interface {
  57.     Reset()
  58. }
  59.  
  60. type Coord struct {
  61.     x int
  62.     y int
  63. }
  64.  
  65. type Player struct {
  66.     health   int
  67.     position Coord
  68. }
  69.  
  70. func (p *Player) Reset() {
  71.     p.health = 100
  72.     p.position = Coord{0, 0}
  73. }
  74.  
  75. func Reset(r Resetter) {
  76.     r.Reset()
  77. }
  78.  
  79. func Plres() {
  80.     player := Player{50, Coord{5, 5}}
  81.     fmt.Println(player)
  82.     Reset(&player)
  83.     fmt.Println(player)
  84. }
  85.  
  86. //Иногда необходимо получить доступ к базовому типу, который реализует интерфейс
  87. //Вызывайте функции, вносите изменения и т.д.
  88. func ResetWithPenalty(r Resetter) {
  89.     //Если тип реализатора Resetter это Player
  90.     if player, ok := r.(*Player); ok {
  91.         player.health = 50
  92.     } else {
  93.         r.Reset()
  94.     }
  95. }
Add Comment
Please, Sign In to add comment