возвращаемое значение в функции при использовании defer - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть некоторые проблемы с использованием 'defer' относительно возвращаемого значения.Я пытался запустить одну тестовую функцию по-другому (отличается только определение i), но результат другой.Итак, я запутался по поводу другого возвращаемого значения.Вот проблема:

функция 1:

package main
import "fmt"
func main() {
    fmt.Println("a return:", a()) // return value: 0
}

func a() int {
    var i int
    defer func() {
        i++
        fmt.Println("a defer1:", i) // print " a defer1: 1"
    }()
    return i
}

возвращаемое значение:

a defer1: 1
a return: 0

функция 2:

package main
import "fmt"

func main() {
    fmt.Println("a return:", a()) // return value: 1
}

func a() (i int) {
    defer func() {
        i++
        fmt.Println("a defer1:", i) // print " a defer1: 1"
    }()
    return i
}

возвращаемое значение:

a defer1: 1
a return: 1

Одно из возвращаемых значений равно 0, другое равно 1. Итак, вопрос в том, в чем разница между двумя функциями.

1 Ответ

0 голосов
/ 25 декабря 2018

В чем разница между двумя функциями?


Спецификация языка программирования Go

Отсрочкаоператоры

Оператор "defer" вызывает функцию, выполнение которой откладывается до момента возврата окружающей функции.

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

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


Разница заключается в том, что функция окружения имеет именованный параметр результата

func a() (i int)

по сравнению сокружающая функция с безымянным параметром результата

func a() int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...