2012-10-17 14 views
26

W języku programowania go, dlaczego po zaimportowaniu pakietu nadal muszę poprzedzać metodę w tym pakiecie nazwą pakietu?importowanie pakietów w go

tj

import "io/ioutil" 

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

Czy nie jest to zbędne? Na przykład w Javie możesz robić rzeczy takie jak Files.readAllLines itp. Bez importowania plików.

+2

Ja tylko starałem się zrobić Files.readAllLines bez konieczności Pliki importowane i nie skompilować. Nie mogę znaleźć niczego, co mówi, że pakiet java.nio.file jest automatycznie importowany. – Scooter

+0

import to ioutil, ale nazwa pakietu to iotuil, czy to literówka? Mogę to naprawić, jeśli tak jest lub wyjaśnij to proszę. Thnx –

+0

Wykład inauguracyjny GopherCon 2014 Rob Pike'a (jednego z twórców języków) jest naprawdę interesującym wprowadzeniem do procesów myślowych, które przyświecały projektowaniu języka. Obejmuje system paczek (krótko mówiąc, zrobili to dla czytelności). Warto na zegarek. http://www.youtube.com/watch?v=VoS7DsT1rdM –

Odpowiedz

40

Domyślam się, że to nie odpowiada na twoje pytanie, ale jeśli chcesz, możesz wywołać metody bez wyraźnego określenia pakietu - po prostu zaimportuj z . przed nazwami (ale nie jest to zalecane; zobacz poniżej): komentarz

package main 

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

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

Note @ jimt jest poniżej - praktyka ta jest nie poradził poza testami, ponieważ może to spowodować konflikty nazw z przyszłych wydaniach. Ponadto, zdecydowanie zgadzam się z tym, że @ DavidGrayson jest miło czytać/widzieć, skąd się biorą.

+9

Należy zauważyć, że dot-import nie jest uważany za dobrą praktykę. Od [golang.org] (http://golang.org/doc/go1compat.html): Jeśli program importuje standardowy pakiet za pomocą 'importu. "ścieżka" ', dodatkowe nazwy zdefiniowane w zaimportowanym pakiecie w przyszłych wersjach mogą kolidować z innymi nazwami zdefiniowanymi w programie. Nie zalecamy używania opcji 'import .' poza testami, a użycie jej może spowodować, że program nie zostanie skompilowany w przyszłych wydaniach. – jimt

+0

@jimt Niesamowite, dziękuję za to (z jakiegoś powodu było po prostu źle, cieszę się, że tak naprawdę nie jest zalecane :)). Zaktualizuję odpowiedź, aby to odzwierciedlić. – RocketDonkey

+0

Jeśli golang.org ma zastrzeżenia do importu. "ścieżka" powinni usunąć ją z języka. Dlaczego warto korzystać z testów ("poza testami ...")? Czy w dzisiejszych czasach testy nie są przechowywane na zawsze? I. import, jest dokładnie tym, co robi każda instrukcja importu w Javie. W rzeczywistości są to wszystkie instrukcje importowania w języku Java. Nie widzę zbyt wiele kodu java, który nie wykonuje ". Importu". – Scooter

6

Nie mogę naprawdę mówić za projektantów języka Go, ale miło jest móc szybko określić, gdzie zdefiniowana jest metoda, do której dzwonisz. Miło jest też zobaczyć listę wszystkich pakietów, których używasz na górze pliku. To nie jest zbyteczne.

Tak jak powiedziałeś, Java wymaga, abyś powiedział Files.readAllLines i podobnie wymaga napisania ioutil.ReadFile.

+1

Pliki w Files.readAllLines nie są nazwą pakietu. Jest to nazwa klasy używana do wywoływania metody statycznej. Pakiet dla Files to plik java.nio.file, więc bez importu java.nio.file.Files; musielibyście powiedzieć: java.nio.file.Files.readAllLines() – Scooter

28

można importować i zmienić nazwę pakietu, np

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 
    ) 

Zobacz również https://golang.org/ref/spec#Import_declarations

Powiązane problemy