воскресенье, 13 января 2019 г.

Основы Go: методы

В Go нет классов. Тем не менее, вы можете объявлять методы для типов.

Метод - это функция со специальным аргументом, известным как получатель.

Получатель указывается в отдельном списке аргументов между ключевым словом func и именем метода.

В следующем примере метод Abs имеет получателя с типом Vertex и именем v.

package main

import (
  "fmt"
  "math"
)

type Vertex struct {
  X, Y float64
}

func (v Vertex) Abs() float64 {
  return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
  v := Vertex{3, 4}
  fmt.Println(v.Abs())
}

Вывод:

5

Метод - это всего лишь функция, для которой указан получатель.

В следующем примере Abs является обычной функцией с тем же функционалом, что и в предыдущем примере.

package main

import (
  "fmt"
  "math"
)

type Vertex struct {
  X, Y float64
}

func Abs(v Vertex) float64 {
  return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
  v := Vertex{3, 4}
  fmt.Println(Abs(v))
}

Вывод:

5

Объявлять методы можно не только для структур.

В следующем примере мы видим числовой тип MyFloat и его метод Abs.

Вы можете объявить метод только с получателем, чей тип объявлен в том же пакете, что и сам метод. Вы не можете объявить метод с получателем, чей тип объявлен в другом пакете (что также верно для встроенных типов, таких как int).

package main

import (
  "fmt"
  "math"
)

type MyFloat float64

func (f MyFloat) Abs() float64 {
  if f < 0 {
    return float64(-f)
  }
  return float64(f)
}

func main() {
  f := MyFloat(-math.Sqrt2)
  fmt.Println(f.Abs())
}

Вывод:

1.4142135623730951


Читайте также:


Комментариев нет:

Отправить комментарий