Direkt zum Hauptinhalt springen
eLearner.app
Modul 9 · Lektion 4 von 544/50 im Kurs~12 min
Lektionen des Moduls (4/5)

Go-Module

Ein Go-Modul ist eine versionierbare Einheit, die aus einem oder mehreren Paketen besteht. Es ist die Grundlage des modernen Abhängigkeitssystems (Go 1.11+): kein GOPATH mehr, kein obligatorischer vendor mehr, explizite und reproduzierbare Abhängigkeiten.

go.mod: das Modulmanifest

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

Drei Hauptrichtlinien:

  • module <path> – der Importpfad des Moduls. Alle internen Pakete werden als example.com/myapp/sub/pkg importiert. Es muss keine echte URL sein, aber zur Veröffentlichung über go get muss sie aufgelöst werden.
  • go <version> – die mindestens erforderliche Go-Version (wird auch verwendet, um zu steuern, welche Sprachfunktionen zulässig sind, z. B. Range-Over-Func in 1.23).
  • require – die direkten Abhängigkeiten mit ihrer genauen Version.

Andere Anweisungen: replace (ersetzt eine Dep durch einen Fork oder einen lokalen Pfad), exclude, retract.

go.sum: die kryptografische Sperrdatei

Neben go.mod enthält go.sum einen kryptografischen Hash JEDER heruntergeladenen Version (einschließlich transitiver Abhängigkeiten). Es garantiert Reproduzierbarkeit: Wenn jemand eine veröffentlichte Version manipuliert, schlägt der Build fehl.

Immer festschreiben. Es wird automatisch durch go-Befehle aktualisiert.

Wichtige Befehle

Bash
go mod init example.com/myapp        # create go.mod
go get github.com/google/uuid        # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./...                      # upgrade every dep
go mod tidy                          # remove unused deps, add missing ones
go mod download                      # download everything into the cache
go mod why github.com/x/y            # explain why a dep is included
go mod graph                         # full dependency graph

go mod tidy ist derjenige, den Sie nach jeder Änderung an Importen ausführen: Er garantiert, dass go.mod genau die tatsächlich verwendeten Pakete widerspiegelt.

Semantische Importversionierung (SIV)

Versionen folgen SemVer: v1.2.3 = MAJOR.MINOR.PATCH. Der interessante Teil ist major v2+:

  • Major v0 und v1 → normaler Pfad: github.com/foo/bar.
  • Hauptversion v2 oder höher → der Pfad enthält die Hauptversion: github.com/foo/bar/v2.
Go
import "github.com/foo/bar/v2"

Dadurch können Sie v1 und v2 derselben Bibliothek gleichzeitig importieren (nützlich bei progressiven Migrationen).

Pfade und interne Pakete importieren

Wenn Ihr Modul example.com/myapp ist, wird ein utils/-Unterordner importiert als:

Go
import "example.com/myapp/utils"

Der Pfad hängt nur vom in go.mod deklarierten Namen ab, nicht vom Speicherort auf der Festplatte: Derselbe Code in einem anderen Ordner funktioniert weiterhin.

Arbeitsbereichsmodus (Go 1.18+)

Um an mehreren Modulen zu arbeiten, die gleichzeitig aufeinander verweisen (z. B. eine Bibliothek und eine App, die sie verwendet):

Bash
go work init ./lib ./app

Dadurch wird go.work erstellt: go build verwendet die lokale Version von ./lib, anstatt die veröffentlichte Version herunterzuladen. go.work nicht festschreiben (es handelt sich um eine Entwicklungsumgebung).

Übungen

Übung#go.m9.l4.e1
Versuche: 0Wird geladen…

Das Modul heißt example.com/myapp und enthält einen Unterordner „utils“. Importieren Sie das Unterpaket unter Verwendung des vollständigen Pfads in main.

Editor wird geladen…
Hinweis anzeigen

Der Importpfad ist der Modulname (von go.mod) plus der relative Pfad des Ordners.

Lösung nach 3 Versuchen verfügbar

Übung#go.m9.l4.e2
Versuche: 0Wird geladen…

Wandeln Sie die einzelnen Importe mit der Syntax import ( ... ) in eine Importgruppe um und importieren Sie dabei sowohl fmt als auch os.

Editor wird geladen…

Lösung nach 3 Versuchen verfügbar

Quiz#go.m9.l4.e3
Bereit

Welcher Befehl entfernt nicht mehr importierte Abhängigkeiten aus go.mod und fügt die fehlenden hinzu?

Go
$ go mod ???
Antwortoptionen