如何避免不可达的代码与开关情况?



我们有以下代码场景:

func f(a, b, c *int) *int {
check := c == nil
switch check {
case true:
if g(a) {
return nil
}
return h(a)
case false:
return k(a, b, c)
}
return nil // non reachable code
}

return nil为不可达代码。可复制代码:https://play.golang.org/p/lIrTxZkNbg6

为什么Go编译器抱怨不可达的代码?如何避免不可访问的代码?切换大小写语法是否会导致无法访问的代码?

你的switch语句正在评估一个只有2个可能选择的布尔值,所以它不可能到达最终的返回语句。在这种特殊情况下,使用if而不是开关

更具可读性。
if check {
if g(a) {
return nil
}
return h(a)
}
return k(a, b, c)

用更简单的术语重写你的函数(使用if)。

func f(a, b, c *int) *int {
if c == nil {
if g(a) {
return nil
}
return h(a)
}

return k(a, b, c)
}

编译器只知道该语句在终止语句之后是不可访问的。终止switch语句:

"switch"语句,其中:

  • 没有"break"引用"开关"的语句;声明中,
  • 有一个默认情况,而
  • 语句列出每种情况,包括默认情况,以终止语句结束,或可能标记的"fallthrough";声明。
因此,规则不够全面,无法确定这种情况,即交换数据类型的每个可能值都有一个终止大小写(如这里所示)。该规则会给编译器和语言增加不必要的复杂性,因为实际上,它只适用于您在这里展示的确切情况,而这种情况可以(也应该)很容易地被if/else语句取代。

请记住,switch语句中的case值不一定需要是常量或唯一的,并且bool可以说是唯一具有足够少的唯一值的数据类型,您可以在switch语句中实际覆盖所有值。

最新更新