In der Programmiersprache Go spielt die Organisation von Code durch Pakete und das Sichtbarkeitssystem eine entscheidende Rolle für Modularität, Wiederverwendbarkeit und die Kapselung von Logik.
Im Gegensatz zu vielen klassischen Sprachen mit objektorientierter Vererbung wurde Go von Grund auf mit einfachen Modulen gedacht — Paketen mit klaren Regeln für Export und Import. Dieses Erbe verkörpert eine Philosophie von Minimalismus, Einfachheit und strenger Kontrolle über Abhängigkeiten.
Wenn Komponenten keine klare Sichtbarkeit haben, entsteht ein Chaos bei den Namen, es ist schwierig, Abhängigkeiten zwischen Dateien nachzuvollziehen, und das Risiko steigt, dass private Implementierungsdetails versehentlich verwendet werden. Fehler bei der Organisation des Exports können zu schwer zu debuggen Bugs und einer Verletzung der Kapselung führen.
In Go gehört jede Datei zwingend zu einem Paket (package name). Der gesamte Sichtbarkeitsbereich in Go wird bestimmt durch:
Alle Funktionen, Typen, Variablen, Konstanten, Methoden, deren Namen mit einem Großbuchstaben beginnen, werden aus dem Paket exportiert und sind für andere Pakete nach dem Import verfügbar. Alle anderen sind nur innerhalb des Pakets verfügbar.
Beispielstruktur:
project/
│
├── main.go // package main
└── mathutil/
└── mathutil.go // package mathutil
Beispielcode:
// mathutil/mathutil.go package mathutil // Public - exportierte Funktion func Sum(a, b int) int { return a + b } // private - nicht exportierte Funktion func subtract(a, b int) int { return a - b }
// main.go package main import ( "fmt" "project/mathutil" ) func main() { fmt.Println(mathutil.Sum(2, 3)) // 5 // fmt.Println(mathutil.subtract(3,2)) // Kompilierungsfehler! subtract ist nicht exportiert }
Schlüsselfeatures:
Kann man eine Variable oder Funktion, die mit einem Kleinbuchstaben deklariert wurde, mit anderen Mechanismen exportieren?
Nein. In Go gibt es keine Schlüsselwörter wie public, private; alles wird nur durch den ersten Buchstaben des Namens bestimmt (Unicode-Kategorie — Großbuchstabe).
Können Funktionen aus einer Datei eines Pakets private Funktionen aus einer anderen Datei desselben Pakets verwenden?
Ja, die Sichtbarkeit ist auf Paketebene und nicht auf Dateiebene beschränkt. Alle privaten Elemente sind in allen Dateien eines Pakets verfügbar.
Beispielcode:
// mathutil/helpers.go package mathutil func hiddenHelper() int { return 42 } // mathutil/mathutil.go package mathutil func UseHelper() int { return hiddenHelper() // verfügbar! }
Kann man die gleiche Funktion oder den gleichen Typ mit demselben Namen innerhalb eines Pakets in verschiedenen Dateien erstellen?
Nein, es wird ein Kompilierungsfehler auftreten — innerhalb eines Pakets müssen die Namen eindeutig sein, auch wenn sie in verschiedenen Dateien deklariert sind.
xxx_test.go im selben Paket zu verwenden)Ein größeres Team legt alle Hilfsfunktionen und Typen in das Paket util und exportiert alles:
Vorteile:
Nachteile:
Das Team unterteilt den Code sorgfältig nach Modulen und Geschäftsfeldern und exportiert nur APIs:
Vorteile:
Nachteile: