错过回报让我发疯
我正在尝试学习 Go,它进行得非常好,除了函数 return 语句,我一生都无法掌握这些语句。在书中的一个练习中,建议构造一个函数,将 int 减半并返回减半的 int,如果是偶数或奇数(减半),则返回一个布尔值。没有问题,这是相关的代码。
func checker(input int) (int, bool){
if (((input /2) % 2) == 0) {
return input / 2, true
} else {
return input / 2, false
}
}
但是当试图将其转换为接受切片时,我发誓我无法理解回报在哪里。这里再次是相关的代码:
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 statements would be reached.
所以编译器抱怨缺少返回是正确的,因为这个条件是在运行时决定的。
例如,如果您传递0arguments: checker(),则它是有效的,如果return不需要a则会导致问题。
所以只需添加一个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
}
Also note that this loop only checks the first passed argument and returns, probably not what you want.