2012-09-13 25 views
2

我試圖讓一個目錄使用此功能列表:這個範圍的使用有什麼問題?

package main; 
import ("fmt"; "os"; "io/ioutil") 

func main() { 
    dir, _ := ioutil.ReadDir("..") 
    var f os.FileInfo 
    for f = range dir { 
     fmt.Println(f.Name()) 
    } 
} 

按照documentation of ReadDir,它應該返回[]os.FileInfo作爲第一個返回參數。然而,當我嘗試編譯它時,我得到了

cannot assign type int to f (type os.FileInfo) in range: int does not implement os.FileInfo (missing IsDir method) 

我錯過了什麼?

回答

6

這應該工作:

for _, f = range dir { 
     fmt.Println(f.Name()) 
    } 

你忽略的指標,只有指定目錄條目。

如果你不需要,你不必聲明var。這也將工作:

func main() { 
    dir, _ := ioutil.ReadDir("..") 
    for _, f := range dir { 
     fmt.Println(f.Name()) 
    } 
} 

注意 ':=' 後 '_, f',而不是你的 'f ='。

該問題不是來自ReadDir()返回的內容,而是來自返回(index,value)的range表達式。
從轉到規格 「For Statements」:

Range expression       1st value   2nd value (if 2nd variable is present) 

array or slice a [n]E, *[n]E, or []E index i int a[i]  E 
+0

謝謝!我知道我可以省略聲明,只是爲了得到更明確的編譯器錯誤。它仍然避開了我爲什麼要把這個指數放在一個區間的迴歸中。如果可能的話,是不是要避免按索引進行迭代? – Tobias

+0

@Tobias本身可能是一個很好的問題。我想它遵循複合字面值的邏輯(http://golang.org/ref/spec#Composite_literals),首先找到鍵或索引,然後值 – VonC

+0

有意義。但我害怕如果我要問這個問題,它可能會被關閉爲「不相關的編程」或... – Tobias