"для истины {}" происходит "пропущенный возврат в конце функции" - PullRequest
0 голосов
/ 19 ноября 2018

Посмотрите на следующие два фрагмента кода:
code1:

func getIntJ1() (j int32) {
    for {
        j = 20
        return
    }
}

code2:

func getIntJ2() (j int32) {
    for true {
        j = 20
        return
    }
}

Детская площадка:https://play.golang.org/p/ZnwjZDksZhu

Я думаю, что они должны напечатать одно и то же значение 20 в консоли, но они не могут делать то, что я хочу.
code1 может напечатать значение 20в консоли, но code2 происходит ошибка компиляции: missing return at end of function.

Все они имеют infinite loop в функции, почему они отображаются с разным результатом?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

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

A for без break и без условия цикла считается завершающим оператором, но for с условием цикла не считается, даже если это условие цикла всегда истинно. (Правила могут быть расширены для подсчета for с true в качестве его условия в качестве завершающего оператора, но добавление слишком большого количества случаев делает определение более запутанным, чем полезным.) Ваше второе определение getIntJ не имеет завершающего оператора.

0 голосов
/ 19 ноября 2018

В соответствии с инструкциями вставить возврат.

package main

import (
    "fmt"
)

func main() {
    fmt.Println(getIntJ1())
    fmt.Println(getIntJ2())
}

func getIntJ1() (j int32) {
    for {
        j = 20
        if j == 21 {
            continue
        }
        return
    }
}

func getIntJ2() (j int32) {
    for true {
        j = 20
        if j == 21 {
            continue
        }
        return
    }
    return
}

Детская площадка: https://play.golang.org/p/QbYQ6NkOMpQ

Выход:

20
20

Для getIntJ1, for {}, return никогда не нужен. Для getIntJ2, for condition {} может потребоваться return. Компилятор может быть умнее, когда condition равен true

Более логично писать for {}, чем for true {}.

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