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

```go
var remember bool = false
if something {
    remember := true //错误
}
// 使用remember
```

在此代码段中，`remember`变量永远不会在`if`语句外面变成`true`，如果`something`为`true`，由于使用了短声明`:=`，`if`语句内部的新变量`remember`将覆盖外面的`remember`变量，并且该变量的值为`true`，但是在`if`语句外面，变量`remember`的值变成了`false`，所以正确的写法应该是：

```go
if something {
    remember = true
}
```

此类错误也容易在`for`循环中出现，尤其当函数返回一个具名变量时难于察觉 ，例如以下的代码段：

```go
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
}
```

## 链接

* [目录](https://github.com/yangchuansheng/the-way-to-go_ZH_CN/tree/f30ab7d8c58f85840a0afb548024b93642b518d5/eBook/directory.md)
* 上一节：[常见的陷阱与错误](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-si-bu-fen-shi-ji-ying-yong/16.0)
* 下一节：[误用字符串](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-si-bu-fen-shi-ji-ying-yong/16.0/16.2)
