Почему возвращаемое значение не возвращается при выполнении этого отложенного оператора (без возврата)? - PullRequest
0 голосов
/ 11 октября 2018

Я читаю спецификацию go и не до конца понимаю поведение примера для отсрочки.

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

Функция имеет именованный возврат, который анонимно откладываетсяприращение функции.Функция заканчивается "return 0".Это значение не возвращается, но вместо этого увеличивается значение переменной.

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

//b returns 1
func b() (result int) {
    result = 10
    defer func() {
        result++
    }()
    return 0
}

Однако, если последняя строка изменяется на:

return result

Вещиведите себя так, как я ожидал.

https://play.golang.org/p/732GZ-cHPqU

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

1 Ответ

0 голосов
/ 11 октября 2018

В спецификации говорится об отложенных функциях :

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

и , и это касается операторов возврата :

A "return"оператор, который задает результаты, устанавливает параметры результата перед выполнением любых отложенных функций.

Пример 1:

func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

Переменная result инициализируется нулем;оператор return устанавливает result в ноль;отложенная функция увеличивается result до 1;функция возвращает 1.

Пример 2:

func b() (result int) {
    result = 10
    defer func() {
        result++
    }()
    return 0
}

Переменная result установлена ​​в 10 в первом операторе функции;оператор return устанавливает result на ноль;отложенная функция увеличивает result до 1;функция возвращает 1.

Пример 3:

func c() (result int) {
    result = 10
    defer func() {
        result++
    }()
    return result
}

Переменная result установлена ​​в 10 в первом операторе функции;оператор возврата устанавливает result в 10;отложенная функция увеличивает result до 11, функция возвращает 11.

...