Переменная не используется при использовании именованного возвращаемого типа

Почему я могу сделать следующее, чтобы определить итератор в Go:

func f() func() int {
    i := 1
    return func() int {
        i++
        return i
    }
}

но это приведет к ошибке переменной не используется (i не используется)?

func f() func() int {
    i := 1
    return func() (i int) {
        i++
        return
    }
}

основная функция:

func main() {
    iter := f()
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
}

Для меня обе версии делают одно и то же: они используют f в качестве итератора. f использует замыкания (точнее i). Первая версия явно возвращает увеличенный i, а вторая неявно, ссылаясь на него через именованный возвращаемый тип.

Для меня обе версии одинаковы, так почему я получаю сообщение об ошибке?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
4
0
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во втором случае возвращаемое значение (i int) скрывает внешнее объявление i := 1. Итак, это первое i, которое не используется. Это означает, что второй пример вообще не является замыканием.

С точки зрения обзора ваш второй пример такой же, как:

func f() func() int {
    i := 1
    return func(i int) int {
        i++
        return
    }
}

В этом случае должно быть ясно, что внутренний i отчетлив и затеняет внешний.

Спасибо большое. Я не знал этого. Не могли бы вы указать, почему именованное возвращаемое значение совпадает с именованным аргументом? У вас есть ссылка, где я мог бы прочитать об этом?

User12547645 09.04.2019 14:06

@ User12547645: «Параметры результата действуют как обычные локальные переменные, и функция может присваивать им значения по мере необходимости». Как всегда, прочитайте спецификацию языка программирования Go: golang.org/ref/spec.

peterSO 09.04.2019 14:26

Спасибо @icza. Поэтому, если я использую именованный возвращаемый параметр, этот параметр инициализируется как нулевое значение (0 для целых чисел). Вот почему это похоже на новый параметр. Спасибо.

User12547645 09.04.2019 14:27

Другие вопросы по теме