2012-10-17 21 views
26

Warum muss ich nach dem Importieren eines Pakets in der Programmiersprache go eine Methode innerhalb dieses Pakets mit dem Paketnamen voranstellen?Importieren von Paketen in go

heißt

import "io/ioutil" 

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

Ist das nicht überflüssig? In Java können Sie zum Beispiel Dateien wie File.readAllLines usw. ausführen, ohne Dateien importieren zu müssen.

+2

Ich habe gerade versucht einen Files.readAllLines zu tun, ohne Dateien importiert zu haben, und es hat nicht zu kompilieren. Ich kann nichts finden, was besagt, dass das Paket java.nio.file automatisch importiert wird. – Scooter

+0

der Import ist ioutil, aber der Paketname ist iotuil, ist das ein Tippfehler? Könnte das beheben, wenn es das ist oder klär mich bitte. Thnx –

+0

Die Keynote der GopherCon 2014 von Rob Pike (einer der Ersteller von Sprachen) ist eine sehr interessante Einführung in die Denkprozesse, die in die Gestaltung der Sprache eingeflossen sind. Es umfasst das Paketsystem (kurz gesagt, sie haben es aus Gründen der Lesbarkeit getan). Es ist eine Uhr wert. http://www.youtube.com/watch?v=VoS7DsT1rdM –

Antwort

40

Ich denke, dass dies nicht wirklich Ihre Frage beantwortet, aber wenn Sie möchten, können Sie die Methoden aufrufen, ohne explizit das Paket anzugeben - importieren Sie einfach mit einem . vor den Namen (aber das wird nicht empfohlen; siehe unten):

package main 

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

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

Hinweis @ jimt Kommentar unten - diese Praxis ist nicht außerhalb von Tests empfohlen, da es Namenskonflikte mit zukünftigen Versionen verursachen könnte. Auch stimme definitiv mit @ DavidGrayson überein, dass es schöner ist zu lesen/zu sehen, woher die Dinge kommen.

+9

Es sollte beachtet werden, dass der Punkt-Import nicht als gute Praxis angesehen wird. Von [golang.org] (http://golang.org/doc/go1compat.html): Wenn ein Programm ein Standardpaket über 'import 'importiert. "path" ', zusätzliche Namen, die in zukünftigen Versionen im importierten Paket definiert sind, können zu Konflikten mit anderen im Programm definierten Namen führen. Wir empfehlen die Verwendung von 'import.' außerhalb von Tests nicht, und deren Verwendung kann dazu führen, dass ein Programm in zukünftigen Versionen nicht kompiliert werden kann. – jimt

+0

@jimt Super, danke dafür (es hat sich einfach aus irgendeinem Grund falsch gefühlt, froh, dass es eigentlich nicht ratsam ist :)). Ich werde die Antwort aktualisieren, um das zu reflektieren. – RocketDonkey

+0

Wenn golang.org einen Importeinwand hat. "Pfad" sollten sie es aus der Sprache entfernen. Warum sollte es gut sein, Tests zu verwenden ("außerhalb von Tests ...")? Werden Tests heutzutage nicht für immer aufbewahrt? Und das . Import ist genau das, was jede Importanweisung in Java tut. In der Tat sind das alle Importanweisungen in Java. Ich sehe nicht viel Java-Code, der kein ".import" macht. – Scooter

6

Ich kann nicht wirklich für die Entwickler der Go-Sprache sprechen, aber es ist schön, in der Lage zu sein, schnell zu sagen, wo die Methode, die Sie anrufen, definiert ist. Es ist auch schön, eine Liste aller Pakete zu sehen, die Sie am Anfang der Datei verwenden. Dies ist nicht redundant.

Wie Sie gesagt haben, erfordert Java Sie zu sagen Files.readAllLines und in ähnlicher Weise müssen Sie schreiben ioutil.ReadFile.

+1

Dateien in Files.readAllLines ist kein Paketname. Es ist ein Klassenname, der zum Aufrufen einer statischen Methode verwendet wird. Das Paket für Files ist java.nio.file, also ohne Import java.nio.file.Files; Sie müssten sagen: java.nio.file.Files.readAllLines() – Scooter

28

Sie importieren können und die Paketnamen umbenennen, zB:

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 
    ) 

Siehe auch https://golang.org/ref/spec#Import_declarations

Verwandte Themen