将@Cerise Limón的 comments 扩展为一个答案,断言"第一个代码在技术上是正确的"是错误的.
前Go language specification says this名:
如果函数的签名声明了结果参数,则为the function body's statement list must end in a terminating statement.
和also this:
[terminating statements include] a "for" statement in which:
- there are no "break" statements referring to the "for" statement, and
- the loop condition is absent, and
- the "for" statement does not use a range clause.
(由我补充强调)
判断第一个函数中的代码,我们可以看到规范中的这些条件不满足:
func TestMethod() int {
for i:= 0; i < 10; i++ {
return 0
}
}
该函数有一个RESULT参数(返回值为int
),因此必须以终止语句结束,但该函数的最后一条语句是for
语句with a condition,这是规范定义的not条"终止语句".
这看起来可能有些奇怪,但实际上在技术上是正确的.
奖励material
那么为什么第二个功能是好的呢?
func TestMethod() int {
for {
return 0
}
}
在本例中,该函数中的最后一个语句是for
,no condition,and,no break statement referring to the for loop,满足终止语句的语言规范定义.
这其中有逻辑在起作用.
如果没有条件的for
语句包含break
,则循环may终止,因此函数需要返回语句.
如果没有条件的for
语句not包含break
(并且没有return
语句),则循环不会终止(至少,不会是需要函数返回值的正常执行路径的结果).
同样值得注意的是,没有控制流分析来确定是否有任何break
条语句是可到达的;例如,下面的代码还会触发"未返回"编译错误,即使break
显然无法访问:
func foo() int {
for {
if false {
break
}
return 0
}
// <-- error: missing return
}