mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-11-13 09:16:10 +08:00
41 lines
1.1 KiB
Markdown
41 lines
1.1 KiB
Markdown
# 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)
|