2012-10-17 26 views
26

Nel linguaggio di programmazione go, perché dopo aver importato un pacchetto devo ancora prefisso un metodo all'interno di quel pacchetto con il nome del pacchetto?importazione pacchetti in go

cioè

import "io/ioutil" 

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

Non è questo ridondante? In Java, ad esempio, puoi fare cose come Files.readAllLines ecc senza importare i file.

+2

ho solo cercato di fare un Files.readAllLines senza dover file importati e non avete compilato. Non riesco a trovare nulla che dice che il pacchetto java.nio.file viene importato automaticamente. – Scooter

+0

l'importazione è ioutil, ma il nome del pacchetto è iotuil, è un errore? Potrebbe sistemarlo se lo è o chiarirlo per favore. Thnx –

+0

Il discorso programmatico del GopherCon 2014 di Rob Pike (uno dei creatori di linguaggi) è un'introduzione molto interessante ai processi mentali che sono andati alla progettazione della lingua. Copre il sistema dei pacchetti (in breve, lo hanno fatto per la leggibilità). Vale la pena un orologio. http://www.youtube.com/watch?v=VoS7DsT1rdM –

risposta

40

Immagino che questo non risponda alla tua domanda, ma se vuoi, puoi effettivamente chiamare i metodi senza dichiarare esplicitamente il pacchetto - basta importare con un . davanti ai nomi (ma questo non è raccomandato, vedi qui di seguito): commento

package main 

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

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

Nota @ di jimt qui sotto - questa pratica è non consigliato al di fuori del test in quanto potrebbe causare conflitti di nome con le versioni future. Inoltre, sono assolutamente d'accordo con il punto di DavidGrayson di essere più gentile da leggere/vedere da dove vengono le cose.

+9

Va notato che l'importazione punto non è considerata una buona pratica. Da [golang.org] (http://golang.org/doc/go1compat.html): Se un programma importa un pacchetto standard usando 'import. "percorso" ', i nomi aggiuntivi definiti nel pacchetto importato nelle versioni future potrebbero entrare in conflitto con altri nomi definiti nel programma. Non raccomandiamo l'uso di "import". Al di fuori dei test, e l'utilizzo di questo potrebbe far fallire la compilazione di un programma nelle versioni future. – jimt

+0

@jimt Fantastico, grazie per questo (è stato semplicemente sbagliato per qualche motivo, felice che in realtà non sia consigliato :)). Aggiornerò la risposta per riflettere questo. – RocketDonkey

+0

Se golang.org ha un'obiezione da importare. "percorso" dovrebbero rimuoverlo dalla lingua. Perché sarebbe una buona cosa usare per i test ("al di fuori dei test ...")? I test non vengono mantenuti per sempre in questi giorni? E il . import, è esattamente ciò che fa ogni istruzione import in Java. In effetti, sono tutte le istruzioni import in Java. Non vedo molto codice java che non sta facendo un ".import". – Scooter

6

Non riesco davvero a parlare per i progettisti della lingua Go, ma è bello essere in grado di dire rapidamente dove è definito il metodo che si sta chiamando. È anche bello vedere un elenco di tutti i pacchetti che stai utilizzando nella parte superiore del file. Questo non è ridondante.

Come hai detto, Java richiede di dire Files.readAllLines e analogamente go richiede di scrivere ioutil.ReadFile.

+1

I file in Files.readAllLines non sono un nome di pacchetto. È un nome di classe utilizzato per chiamare un metodo statico. Il pacchetto per Files è java.nio.file, quindi senza import java.nio.file.Files; dovresti dire: java.nio.file.Files.readAllLines() – Scooter

28

è possibile importare e rinominare il nome del pacchetto, ad esempio:

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 
    ) 

Vedi anche https://golang.org/ref/spec#Import_declarations

Problemi correlati