2016-05-18 13 views
1

Ich lerne Go-Sprache und ich habe dieses Beispiel gemacht: http://thenewstack.io/make-a-restful-json-api-go/ , um eine einfache REST-API zu erstellen.GoLang und Pakete Layout mit relativen Pfaden

Ich habe es kompiliert und alles funktioniert gut, aber alle Quellen sind im Hauptpaket.

Jetzt möchte ich meine .go Dateien in Paketen organisieren, so dass ich mich bewege sie in einige Ordner auf diese Weise:

GOPATH\bin 
GOPATH\pkg 
GOPATH\src\pack1\Handlers.go 
GOPATH\src\pack1\Logger.go 
GOPATH\src\pack1\repo.go 
GOPATH\src\pack1\Todo.go 
GOPATH\src\router\Router.go 
GOPATH\src\router\Routes.go 
GOPATH\src\Main.go 

Main.go nutzt alle Router-Paket so habe ich in der Import-Abschnitt setzen : "./router". Router.go verwendet das Paket pack1, also habe ich in Router.go "../pack1" importiert. Nun, wenn ich versuche, „gehen zu bauen Main.go“ Ich bekomme:

router\Router.go:6: imported and not used: "_/D_/GOPATH/src/pack1" 
router\Router.go:14: undefined: Logger 

und Ähnliche Fehler, scheint so, dass der Import von pack1 Paket, das ich gemacht habe, es ist falsch. Natürlich habe ich in allen Dateien, die zu pack1 gehören, im Header die Definition "package pack1" angegeben.

Ich habe auch gelesen, dass die relativen Importe in Go nicht empfohlen werden und es könnte nützlich sein, die Remote-Pakete wie "github.com/myrepo/mypackage" zu verwenden. Aber ich möchte nicht Remote-Importe verwenden; Ich möchte alle meine Dateien in einem zweiten Moment schieben.

Können Sie mir helfen, besser zu verstehen, wie lokale Importe zwischen Paketen in der Go-Sprache aussehen?

Dank im Voraus

+2

lesen (oder neu zu lesen) durch [How Go-Code schreiben ] (https://golang.org/doc/code.html), die alles detaillierter erklärt. – JimB

+1

Bitte beachten Sie, dass die Fehler "importiert und nicht verwendet" gelesen wurde, so dass der Import funktioniert, aber Sie kein Symbol des Pakets pack1 verwendet haben. Dies bezieht sich auf den nächsten Fehler "undefined: Logger": Wenn 'Logger' in Paketpack1 lebt, dann referenzieren Sie es von einem anderen Paket als' pack1.Logger'. Lesen Sie "How to Write Go Code" noch einmal und schauen Sie sich einige Arbeitspakete online an. – Volker

+0

Danke Jungs für die Antwort, jetzt habe ich verstanden, wie man Pakete auf die richtige Weise importiert! So ist es auch einfacher!Ich habe eine letzte Frage: Ich kann das Projekt noch nicht kompilieren: in Router.go gibt es eine Instanz von Logger, also habe ich in Router.go das Paket "pack1" importiert, aber es steht, dass Logger nicht definiert ist: \ wo bin ich falsch machen? –

Antwort

4

Der Grund Sie ist relativ Importe verwenden nicht angenommen, dass sie innerhalb von $GOPATH nicht funktionieren. Lassen Sie sich von der „relativen“ Teil Ihrer Importwege zu befreien, da alle Einfuhren im Verhältnis zur $GOPATH/src

import (
    "pack1" 
    "router" 
) 

sind, werden Sie auch Ihre Main.go in ein Paket und verschieben wollen, so können Sie Sie vollen Gebrauch von der machen kann gehe Werkzeuge.

+0

Danke Mann! Jetzt habe ich verstanden und alle meine Importe sind in Ordnung! :) Und wenn von Router.go ich eine Funktion aufrufen, die in einer .go-Datei in Pack1 definiert ist, was kann ich tun? Ich habe pack1 von Router.go importiert, aber wenn ich versuche "zu installieren" sagt es, dass die Funktion nicht definiert ist ...: \ Vielen Dank im Voraus –

+0

Problem gelöst, der Paketname fehlte vor, als ich eine Klasse von a anderes Paket. –

0

Wie JimB sagt, lesen Sie durch den 'Wie-Code schreiben gehen' Link, speziell https://golang.org/doc/code.html#ImportPaths

  • Alle Pakete existieren in einem Baum-Verzeichnis bei $ GOPATH/src beginnen.
  • Der Importpfad ist effektiv der vollständige Pfad zum Paket (von 1)
  • Es gibt keine Unterpakete in GO.
  • Haupt Pakete werden verwendet, um Befehle

Also in Ihrem Fall zu schaffen, wird der Importweg „pack1“ und „Router“