make loop

This commit is contained in:
chai2010
2016-01-08 15:42:18 +08:00
parent 92f44beecc
commit a73964c305
3 changed files with 40 additions and 40 deletions

View File

@@ -1,8 +1,8 @@
### 5.6.1. 警告:捕獲迭代變量
节,将介绍Go法作用域的一陷阱。请务必仔细的阅读,弄清楚发生问题的原因。使是经验丰富的程序员也会在这个问题上犯错误
節,將介紹Go法作用域的一陷阱。請務必仔細的閲讀,弄清楚發生問題的原因。使是經驗豐富的程序員也會在這個問題上犯錯誤
虑这个样一个问题:你被要求首先建一些目,再将目录删除。在下面的例子中我用函数值来完成除操作。下面的示例代需要引入os包。了使代码简单,我忽略了所有的异常处理。
慮這個樣一個問題:你被要求首先建一些目,再將目録刪除。在下面的例子中我用函數值來完成除操作。下面的示例代需要引入os包。了使代碼簡單,我忽略了所有的異常處理。
```Go
var rmdirs []func()
@@ -19,7 +19,7 @@ for _, rmdir := range rmdirs {
}
```
你可能感到惑,为什么要在循环体中用循环变量d值一新的局部量,而不是像下面的代码一样直接使用循环变量dir。需要意,下面的代码是错误的。
你可能感到惑,爲什麽要在循環體中用循環變量d值一新的局部量,而不是像下面的代碼一樣直接使用循環變量dir。需要意,下面的代碼是錯誤的。
```go
var rmdirs []func()
@@ -31,9 +31,9 @@ for _, dir := range tempDirs() {
}
```
问题的原因在于循环变量的作用域。在上面的程序中for循环语句引入了新的词法块循环变量dir在这个词法块中被明。在该循环中生成的所有函值都共享相同的循环变量。需要意,函值中记录的是循环变量的存地址,而不是循环变量某一刻的值。以dir例,后续的迭代会不断更新dir的值当删除操作执行时for循已完成dir中存的值等于最后一次迭代的值。意味着,每次os.RemoveAll的调用删除的都是相同的目
問題的原因在於循環變量的作用域。在上面的程序中for循環語句引入了新的詞法塊循環變量dir在這個詞法塊中被明。在該循環中生成的所有函值都共享相同的循環變量。需要意,函值中記録的是循環變量的存地址,而不是循環變量某一刻的值。以dir例,後續的迭代會不斷更新dir的值當刪除操作執行時for循已完成dir中存的值等於最後一次迭代的值。意味着,每次os.RemoveAll的調用刪除的都是相同的目
通常,了解决这个问题,我们会引入一个与循环变量同名的局部量,作为循环变量的副本。比如下面的量dir虽然这看起很奇怪,但很有用。
通常,了解決這個問題,我們會引入一個與循環變量同名的局部量,作爲循環變量的副本。比如下面的量dir雖然這看起很奇怪,但很有用。
```Go
for _, dir := range tempDirs() {
@@ -42,7 +42,7 @@ for _, dir := range tempDirs() {
}
```
这个问题不仅存在基range的循,在下面的例子中,对循环变量i的使用也存在同样的问题
這個問題不僅存在基range的循,在下面的例子中,對循環變量i的使用也存在同樣的問題
```Go
var rmdirs []func()
@@ -55,4 +55,4 @@ for i := 0; i < len(dirs); i++ {
}
```
如果你使用go第八章或者defer5.8节)会经常遇到此类问题。这不是go或defer本身致的,而是因为它们都会等待循环结束后,再行函值。
如果你使用go第八章或者defer5.8節)會經常遇到此類問題。這不是go或defer本身致的,而是因爲它們都會等待循環結束後,再行函值。