пятница, 21 июня 2019 г.

Спецификация Go: return утверждения (return statements)

Утверждение "return" в функции F завершает выполнение F и, необязательно, предоставляет одно или несколько значений результата. Любые функции, отложенные на F (defer функции), выполняются до того, как F вернется к своему вызывающему.

ReturnStmt = "return" [ ExpressionList ] .

В функции без типа результата утверждение "return" не должно указывать какие-либо значения результата.

func noResult() {
    return
}

Есть три способа вернуть значения из функции с типом результата:

1. Возвращаемое значение или значения могут быть явно указаны в утверждении "return". Каждое выражение должно быть однозначным и присваиваться соответствующему элементу типа результата функции.

func simpleF() int {
    return 2
}

func complexF1() (re float64, im float64) {
    return -7.0, -4.0
}

2. Список выражений в утверждении "return" может быть одним вызовом многозначной функции. Эффект такой, как если бы каждое значение, возвращаемое из этой функции, было присвоено временной переменной с типом соответствующего значения, за которым следует утверждение "return", перечисляющее эти переменные, после чего применяются правила предыдущего случая.

func complexF2() (re float64, im float64) {
    return complexF1()
}

3. Список выражений может быть пустым, если тип результата функции указывает имена для ее параметров результата. Результирующие параметры действуют как обычные локальные переменные, и функция может присваивать им значения по мере необходимости. Утверждение "return" возвращает значения этих переменных.

func complexF3() (re float64, im float64) {
    re = 7.0
    im = 4.0
    return
}

func (devnull) Write(p []byte) (n int, _ error) {
    n = len(p)
    return
}

Независимо от того, как они объявлены, все значения результата инициализируются нулевыми значениями для их типа при входе в функцию. Утверждение "return", которое указывает результаты, устанавливает параметры результата перед выполнением любых отложенных функций (deferred functions).

Ограничение реализации: компилятор может запретить пустой список выражений в утверждении "return", если на месте возврата находится другая сущность (константа, тип или переменная) с тем же именем, что и у параметра результата.

func f(n int) (res int, err error) {
    if _, err := f(n-1); err != nil {
        return  // недействительное return утверждение: 
                // err затенена
    }
    return
}


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


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

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