【发布时间】:2016-03-31 19:25:37
【问题描述】:
这是在 Go 中求一个数的阶乘的程序:
func factorial(x uint) uint {
if x == 0 {
return 1
}
return x * (factorial(x - 1))
}
在输入 5 上调用此函数时的输出为 120。但是,如果我添加 else 语句,则会出现错误。
func factorial(x uint) uint {
if x == 0 {
return 1
} else {
return x * (factorial(x - 1))
}
}
错误:function ends without a return statement
我在末尾添加了return:
func factorial(x uint) uint {
if x == 0 {
return 1
} else {
return x * (factorial(x - 1))
}
fmt.Println("this never executes")
return 1
}
我得到了 120 的预期输出。
为什么第二种情况会导致错误?为什么在第三种情况下,即使函数从未到达最后一个return 1,它也会计算出正确的输出?
【问题讨论】:
-
在 Go 中使用
if cond {return}; return是惯用的(显然不是一行)。当你有无限的 for 循环并且循环之后的任何内容都不会执行时,常见的习惯用法是添加panic("unreachable")。 -
将最后一条语句设为
panic("never reached") -
标记为离题并投票关闭,因为此“编译器错误”已修复,相关代码不再导致编译器错误。
标签: go