Утверждение "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
}
Читайте также:
Комментариев нет:
Отправить комментарий