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

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

## 链接

- [目录](directory.md)
- 上一节：[常见的陷阱与错误](16.0.md)
- 下一节：[误用字符串](16.2.md)