16.1 误用短声明导致变量覆盖

最后更新于:2022-04-01 20:58:25

~~~ var remember bool = false if something { remember := true //错误 } // 使用remember ~~~ 在此代码段中,`remember`变量永远不会在`if`语句外面变成`true`,如果`something`为`true`,由于使用了短声明`:=`,`if`语句内部的新变量`remember`将覆盖外面的`remember`变量,并且该变量的值为`true`,但是在`if`语句外面,变量`remember`的值变成了`false`,所以正确的写法应该是: ~~~ if something { remember = true } ~~~ 此类错误也容易在`for`循环中出现,尤其当函数返回一个具名变量时难于察觉 ,例如以下的代码段: ~~~ func shadow() (err error) { x, err := check1() // x是新创建变量,err是被赋值 if err != nil { return // 正确返回err } if y, err := check2(x); err != nil { // y和if语句中err被创建 return // if语句中的err覆盖外面的err,所以错误的返回nil! } else { fmt.Println(y) } return } ~~~
';