Suche…


Paketinitalisierung

Paket kann init Methoden haben, die nur einmal vor main ausgeführt werden.

package usefull

func init() {
    // init code
}

Wenn Sie nur die Paketinitialisierung ausführen möchten, ohne etwas davon zu referenzieren, verwenden Sie den folgenden Importausdruck.

import _ "usefull"

Paketabhängigkeiten verwalten

Go-Abhängigkeiten werden häufig mithilfe des Befehls go get <package> heruntergeladen. Das Paket wird im globalen / shared- $GOPATH/src . Dies bedeutet, dass eine einzelne Version jedes Pakets mit jedem Projekt verknüpft wird, das es als Abhängigkeit enthält. Dies bedeutet auch , dass , wenn ein neuer Entwickler Projekt setzt, werden sie go get die neueste Version von jeder Abhängigkeit.

Sie können jedoch die Erstellungsumgebung konsistent halten, indem Sie alle Abhängigkeiten eines Projekts in das Verzeichnis vendor/ . Wenn Sie die Abhängigkeiten zusammen mit dem Repository Ihres Projekts beibehalten, können Sie die Versionsverwaltung für jedes Projekt durchführen und eine konsistente Umgebung für Ihren Build bereitstellen.

So sieht Ihre Projektstruktur aus:

$GOPATH/src/
├── github.com/username/project/
|   ├── main.go 
|   ├── vendor/
|   |   ├── github.com/pkg/errors
|   |   ├── github.com/gorilla/mux

Verwenden eines anderen Paket- und Ordnernamens

Es ist vollkommen in Ordnung, einen anderen Paketnamen als den Ordnernamen zu verwenden. Wenn wir dies tun, müssen wir das Paket immer noch basierend auf der Verzeichnisstruktur importieren, aber nach dem Import müssen wir mit dem Namen, den wir in der Paketklausel verwenden, darauf verweisen.

Wenn Sie beispielsweise einen Ordner $GOPATH/src/mypck , haben wir eine Datei a.go :

package apple

const Pi = 3.14

Verwendung dieses Pakets:

package main

import (
    "mypck"
    "fmt"
)

func main() {
    fmt.Println(apple.Pi)
}

Obwohl dies funktioniert, sollten Sie einen guten Grund haben, den Paketnamen vom Ordnernamen abzuweichen (oder es kann zu Missverständnissen und Verwirrung führen).

Was nützt das?

Einfach. Ein Paketname ist ein Go- Identifikator :

identifier = letter { letter | unicode_digit } .

Damit können Unicode-Buchstaben in Bezeichnern verwendet werden, z. B. ist αβ ein gültiger Bezeichner in Go. Ordner- und Dateinamen werden nicht von Go, sondern vom Betriebssystem verarbeitet, und für verschiedene Dateisysteme gelten andere Einschränkungen. Es gibt tatsächlich viele Dateisysteme, die nicht alle gültigen Go-Bezeichner als Ordnernamen zulassen. Daher können Sie Ihre Pakete nicht so benennen, wie es die Sprachspezifikation sonst zulässt.

Da Sie die Option haben, andere Paketnamen als ihre Ordner zu verwenden, haben Sie die Möglichkeit, Ihre Pakete so zu benennen, wie es die Sprachspezifikation zulässt, unabhängig vom zugrunde liegenden Betriebssystem und Dateisystem.

Pakete importieren

Sie können ein einzelnes Paket mit der Anweisung importieren:

import "path/to/package"

oder mehrere Importe zusammenfassen:

import (
    "path/to/package1"
    "path/to/package2"
)

Dies wird in den entsprechenden aussehen import innerhalb der Pfade $GOPATH für .go Dateien und lässt Sie exportierten Namen durch Zugriff auf packagename.AnyExportedName .

Sie können auch auf lokale Pakete im aktuellen Ordner zugreifen, indem Sie Paketen mit ./ voranstellen. In einem Projekt mit einer Struktur wie folgt:

project
├── src
│   ├── package1
│   │   └── file1.go
│   └── package2
│       └── file2.go
└── main.go

Sie können dies in main.go , um den Code in file1.go und file2.go zu importieren:

import (
    "./src/package1"
    "./src/package2"
)

Da Paketnamen in verschiedenen Bibliotheken kollidieren können, möchten Sie möglicherweise ein Paket mit einem neuen Namen versehen. Sie können dies tun, indem Sie Ihrer import-Anweisung den Namen voranstellen, den Sie verwenden möchten.

import (
    "fmt" //fmt from the standardlibrary
    tfmt "some/thirdparty/fmt" //fmt from some other library
)

Auf diese Weise können Sie mit fmt.* das frühere fmt Paket und mit tfmt.* das letzte fmt Paket tfmt.* .

Sie können das Paket auch in den eigenen Namespace importieren, sodass Sie ohne das package. auf die exportierten Namen package. Präfix mit einem einzelnen Punkt als Alias:

import (
    . "fmt"
)

Das obige Beispiel importiert fmt in den globalen Namespace und ermöglicht beispielsweise den direkten Aufruf von Printf : Playground

Wenn Sie ein Paket importieren, aber keinen der exportierten Namen verwenden, gibt der Go-Compiler eine Fehlermeldung aus. Um dies zu umgehen, können Sie den Alias ​​auf den Unterstrich setzen:

import (
    _ "fmt"
)

Dies kann nützlich sein, wenn Sie nicht direkt auf dieses Paket zugreifen, aber dessen init Funktionen ausführen müssen.

Hinweis:

Da die Paketnamen auf der Ordnerstruktur basieren, führen alle Änderungen an den Ordnernamen und Importreferenzen (einschließlich Berücksichtigung der Groß- und Kleinschreibung) zu einem Fehler bei der Kompilierzeit "Bei der Importkollision ohne Berücksichtigung der Groß- und Kleinschreibung" in Linux & OS-X, der schwer zu verfolgen ist und fix (die Fehlermeldung ist für bloße Sterbliche irgendwie kryptisch, da versucht wird, das Gegenteil zu vermitteln - der Vergleich ist aufgrund der Groß- / Kleinschreibung fehlgeschlagen).

Beispiel: "Pfad / zu / Paket1" vs "Pfad / zu / Paket1"

Live-Beispiel: https://github.com/akamai-open/AkamaiOPEN-edgegrid-golang/issues/2



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow