суббота, 8 июня 2019 г.

Спецификация Go: вызовы (calls)

Дано выражение f типа функции F,

f(a1, a2, … an)

вызывается f с аргументами a1, a2,… an. За исключением одного особого случая, аргументы должны быть однозначными выражениями, присваиваемыми (assignable) типам параметров F и оцениваться перед вызовом функции. Тип выражения является типом результата F. Вызов метода аналогичен, но сам метод указывается в качестве селектора при значении типа получателя для метода.

math.Atan2(x, y)  // вызов функции
var pt *Point
pt.Scale(3.5)     // вызов метода с получателем pt

При вызове функции значение и аргументы функции оцениваются в обычном порядке. После того, как они оценены, параметры вызова передаются функции по значению, и вызываемая функция начинает выполнение. Возвращаемые параметры функции передаются по значению обратно в вызывающую функцию, когда функция делает возврат (return).

Вызов нулевого значения функции приводит к панике во время выполнения (run-time panic).

В особом случае, если возвращаемые значения функции или метода g равны по числу и индивидуально присваиваются параметрам другой функции или метода f, то вызов f(g(parameters_of_g)) вызовет f после привязки возвращаемых значений от g к параметрам f по порядку. Вызов f не должен содержать никаких параметров, кроме вызова g, а g должен иметь хотя бы одно возвращаемое значение. Если f имеет последний параметр ..., ему присваиваются возвращаемые значения g, которые остаются после назначения обычных параметров.

func Split(s string, pos int) (string, string) {
    return s[0:pos], s[pos:]
}

func Join(s, t string) string {
    return s + t
}

if Join(Split(value, len(value)/2)) != value {
    log.Panic("test fails")
}

Вызов метода x.m() действителен, если набор методов (тип) x содержит m и список аргументов можно назначить списку параметров m. Если x адресуемый, а набор методов &x содержит m, x.m() является сокращением для (&x).m():

var p Point
p.Scale(3.5)

Нет отдельного типа метода и нет литералов метода.


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


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

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