走失 returns 快把我逼疯了

Go missing returns are driving me crazy

我正在努力学习 Go,除了函数 return 语句外,它进展顺利,我一生都无法掌握。 在一本书的练习中,建议构造一个将 int 减半的函数,return 将减半的 int 和偶数或奇数(减半)与 bool。没问题,这是相关代码。

func checker(input int) (int, bool){
    if (((input /2) % 2) == 0) {
        return input / 2, true
    } else {
        return input / 2, false
    }
}

但是当试图将其转换为接受切片时,我发誓我无法理解 return 丢失的位置。这里又是相关代码:

func checker(args ...int) (int, bool){
    for _, v := range args {
        if (((v /2) % 2) == 0) {
            return v / 2, true
        } else {
            return v / 2, false
        }
    }
}

func main () {
    xs := []int{3,45,6,32,43,76,42,4,77,8}
    fmt.Println(checker(xs...))
}

我想现在我明白了我提供的代码中的几个问题,感谢您的回复。

无法保证 checker() 获得超过 零个 个参数,在这种情况下,循环体将执行零次,因此没有 return 语句将达到。

因此编译器有权抱怨缺少 return,因为此条件是在运行时决定的。

例如如果您传递 0 个参数:checker(),它是有效的,如果不需要 return 会导致问题。

所以只需添加一个 return 语句,其中包含合理的 return 值,通常是结果类型的零值:

func checker(args ...int) (int, bool){
    for _, v := range args {
        if (((v /2) % 2) == 0) {
            return v / 2, true
        } else {
            return v / 2, false
        }
    }
    return 0, false
}

另请注意,此循环仅检查第一个传递的参数和 returns,可能不是您想要的。

你return只在For循环作用域中。 Return 在 for 循环之后。如果您的参数为空,那么您的循环不会 运行 并且没有达到 return。所以需要在for循环后加一个return

我建议将其作为错误场景或其他方式处理。下面我提到了这个的简单解决方案。

func checker(args ...int) (int, bool){
    for _, v := range args {
        if ((v /2) % 2 == 0) {
            return v / 2, true
        } else {
            return v / 2, false
        }
    }
    return 0, false
}