2012-10-17 7 views
26

Dans le langage de programmation aller, pourquoi dois-je encore, après avoir importé un paquet, préfixer une méthode dans ce paquet avec le nom du paquet?Importer des paquets dans Go

à savoir

import "io/ioutil" 

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

est-ce pas redondant? En Java, par exemple, vous pouvez faire des choses comme Files.readAllLines etc sans avoir importé des fichiers.

+2

Je viens essayé de faire un Files.readAllLines sans avoir importé des fichiers et il n'a pas compilé. Je ne trouve rien qui dise que le paquetage java.nio.file est importé automatiquement. – Scooter

+0

l'importation est ioutil, mais le nom du paquet est iotuil, est-ce une faute de frappe? Je pourrais corriger cela si c'est le cas ou le clarifier s'il vous plaît. Thnx –

+0

Le discours de GopherCon 2014 par Rob Pike (l'un des créateurs de langues) est une introduction très intéressante aux processus de réflexion qui ont été utilisés pour concevoir le langage. Il couvre le système de paquets (en bref, ils l'ont fait pour la lisibilité). Vaut bien une montre. http://www.youtube.com/watch?v=VoS7DsT1rdM –

Répondre

40

Je suppose que cela ne répond pas vraiment à votre question, mais si vous le souhaitez, vous pouvez appeler les méthodes sans indiquer explicitement le paquet - il suffit d'importer un . devant les noms (mais cela n'est pas recommandé; ci-dessous):

package main 

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

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

Remarque @ commentaire de JIMT ci-dessous - cette pratique est pas conseillé en dehors des essais car elle pourrait provoquer des conflits de nom avec les versions ultérieures. De plus, je suis tout à fait d'accord avec le point de DavidGrayson d'être plus agréable à lire/voir d'où viennent les choses.

+9

Il convient de noter que l'importation par points n'est pas considérée comme une bonne pratique. De [golang.org] (http://golang.org/doc/go1compat.html): Si un programme importe un paquet standard en utilisant 'import. "path" ', les noms supplémentaires définis dans le package importé dans les versions ultérieures peuvent entrer en conflit avec d'autres noms définis dans le programme. Nous ne recommandons pas l'utilisation de 'import .' en dehors des tests, et son utilisation peut empêcher la compilation d'un programme dans les prochaines versions. – jimt

+0

@jimt Génial, merci pour ça (ça m'a paru mal pour une raison quelconque, content que ce soit en fait n'est pas conseillé :)). Je mettrai à jour la réponse pour refléter cela. – RocketDonkey

+0

Si golang.org a une objection à importer. "chemin" ils devraient l'enlever de la langue. Pourquoi serait-ce une bonne chose à utiliser pour les tests ("en dehors des tests ...")? Les tests ne sont-ils pas gardés pour toujours ces jours-ci? Et le . import, est exactement ce que fait chaque instruction d'importation en Java. En fait, ce sont toutes les instructions d'importation en Java. Je ne vois pas beaucoup de code Java qui ne fait pas un ".import". – Scooter

6

Je ne peux pas vraiment parler pour les concepteurs de la langue Go, mais il est bon de savoir rapidement où la méthode que vous appelez est définie. Il est également agréable de voir une liste de tous les paquets que vous utilisez en haut du fichier. Ce n'est pas redondant.

Comme vous l'avez dit, Java vous oblige à dire Files.readAllLines et de même aller vous oblige à écrire ioutil.ReadFile.

+1

Les fichiers dans Files.readAllLines ne sont pas un nom de package. C'est un nom de classe utilisé pour appeler une méthode statique. Le paquet pour les fichiers est java.nio.file, donc sans importer java.nio.file.Files; vous devriez dire: java.nio.file.Files.readAllLines() – Scooter

28

vous pouvez importer et renommer le nom du paquet, par exemple:

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 
    ) 

Voir aussi https://golang.org/ref/spec#Import_declarations

Questions connexes