2012-10-17 44 views
26

在go編程語言中,爲什麼在導入一個包之後,我仍然必須在該包中使用包名稱加一個方法的前綴?在go中導入包

import "io/ioutil" 

func main() { 
    content, err = iotuil.ReadFile("somefile.txt") 
    // etc.. 
} 

這是不是多餘的?例如,在Java中,您可以在不導入文件的情況下執行Files.readAllLines等操作。

+2

我只是試圖做一個Files.readAllLines而無需進口的文件,並沒有編譯。我找不到任何說自動導入java.nio.file軟件包的東西。 – Scooter

+0

導入是ioutil,但包名稱是iotuil,是一個錯字?可以解決,如果是或請澄清。 Thnx –

+0

Rob Pike(語言創造者之一)的GopherCon 2014主題演講對於設計語言的思維過程非常有趣。它涵蓋了軟件包系統(簡而言之,它是爲了可讀性而做的)。值得一看。 http://www.youtube.com/watch?v=VoS7DsT1rdM –

回答

40

我想這並不能真正回答你的問題,但如果你需要的話,你可以實際調用方法而不明確聲明包 - 只需在名稱前面輸入.(但不建議;請參閱如下圖):下面

package main 

import (
    . "fmt" 
    . "io/ioutil" 
) 

func main() { 
    content, err := ReadFile("testfile") 
    if err != nil { 
    Println("Errors") 
    } 
    Println("My file:\n", string(content)) 
} 

注@ JIMT的評論 - 這種做法是不外測試建議,因爲它可能會導致名稱衝突與將來的版本。此外,絕對贊同@ DavidGrayson的觀點:更好地閱讀/查看事情的來源。

+9

應該指出的是,點導入不被認爲是好的做法。 來自[golang.org](http://golang.org/doc/go1compat.html):如果一個程序使用import導入一個標準包。 「路徑」,未來版本中導入包中定義的其他名稱可能與程序中定義的其他名稱衝突。我們不建議在測試之外使用'import .',並且使用它可能會導致程序在將來的版本中無法編譯。 – jimt

+0

@jimt真棒,感謝(因爲某種原因,感覺錯了,很高興這實際上不建議:))。我會更新答案以反映這一點。 – RocketDonkey

+0

如果golang.org反對導入。 「路徑」,他們應該從語言中刪除它。爲什麼使用測試(「測試之外......」)會是一件好事?這些天不是測試永遠保存下來嗎?而且。導入,正是Java中每個導入語句的作用。實際上,這是Java中的所有import語句。我沒有看到很多沒有做「。import」的java代碼。 – Scooter

6

我不能爲Go語言的設計師說話,但能夠快速判斷您所調用的方法在哪裏定義是很好的。在文件頂部看到您正在使用的所有軟件包的列表也很好。這不是多餘的。如你所說,Java要求你說Files.readAllLines,同樣去你要求你寫ioutil.ReadFile

+1

Files.readAllLines中的文件不是軟件包名稱。這是一個用於調用靜態方法的類名。 Files的包是java.nio.file,所以沒有import java.nio.file.Files;你必須說:java.nio.file.Files.readAllLines() – Scooter

28

可以導入並重新命名包名稱,例如:

import ( 
     .  "fmt"  // no name, import in scope 
     File "io/ioutil" // rename ioutil to File 
     _  "net"  // net will not be available, but init() inside net package will be executed 
    ) 

參見https://golang.org/ref/spec#Import_declarations