среда, 5 июня 2019 г.

Спецификация Go: объявления методов

Метод - это функция с получателем (receiver). Объявление метода привязывает идентификатор, имя метода к методу и связывает метод с базовым типом получателя.

MethodDecl = "func" Receiver MethodName Signature [ FunctionBody ] .
Receiver   = Parameters .

Получатель указывается в разделе дополнительных параметров, предшествующих имени метода. В этом разделе параметров должен быть объявлен единственный невариантный (non-variadic) параметр - получатель. Его тип должен быть определенного типа T или указателем на определенный тип T. T называется базовым типом получателя. Базовый тип получателя не может быть указателем или типом интерфейса, и он должен быть определен в том же пакете, что и метод. Считается, что метод связан с базовым типом получателя, а имя метода отображается только в селекторах типа T или *T.

Непустой идентификатор получателя должен быть уникальным в сигнатуре метода. Если на значение получателя не ссылаются внутри тела метода, его идентификатор может быть опущен в объявлении. То же самое относится в целом к параметрам функций и методов.

Для базового типа непустые имена связанных с ним методов должны быть уникальными. Если базовый тип является типом структуры (struct type), непустой метод и имена полей должны быть разными.

Дан определенный тип Point, следующие объявления

func (p *Point) Length() float64 {
  return math.Sqrt(p.x * p.x + p.y * p.y)
}

func (p *Point) Scale(factor float64) {
  p.x *= factor
  p.y *= factor
}

привязывают методы Length и Scale с типом получателя *Point к базовому типу Point.

Тип метода - это тип функции с получателем в качестве первого аргумента. Например, метод Scale имеет тип

func(p *Point, factor float64)

Однако функция, объявленная таким образом, не является методом.


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


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

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