W Go zasięg zmiennych, funkcji, struktur i metod jest ściśle związany z rejestrem pierwszej litery:
Plik example.go:
package mypkg var ExportedVar int // dostępny w innych pakietach var unexportedVar int // tylko w mypkg
Podczas importowania pakietu można odwoływać się tylko do obiektów eksportowanych.
Najlepsza praktyka:
Pytanie: "Czy można eksportować strukturę z nieeksportowanymi polami? Co się stanie, jeśli spróbujemy użyć takich pól w innym pakiecie?"
Odpowiedź: Eksportowana jest tylko struktura z wielką literą. Wszystkie pola struktury, które zaczynają się małą literą, będą niedostępne poza pakietem. Próba odwołania się do takich pól z zewnątrz skompiluje się z błędem.
Przykład:
// package user type User struct { Name string // Eksportowane pole age int // Niedostępne poza pakietem user }
W innym pakiecie:
u := user.User{Name: "Ivan"} u.age = 42 // Błąd kompilacji: age is not accessible
Historia
Utrata danych podczas marshalingu json: W REST API strukturę eksportowano, ale pola zrobiono nieeksportowanymi (z małej litery). W wyniku tego, marshal do JSON nie uwzględniał tych pól, a użytkownicy API nie otrzymywali potrzebnych informacji.
Historia
Nie działa dostęp do potrzebnych funkcji: Zespół wyodrębnił przydatne narzędzia do osobnego pakietu, zapominając nadać im nazwy z wielkiej litery. Funkcje pozostały niedostępne, trzeba było przerabiać interfejsy.
Historia
Kolizja nazw podczas autogeneracji kodu: Podczas generacji kodu w jednym pakiecie używano zmiennych o tych samych nazwach, różniących się rejestrem litery. Jeden ze skryptów przypadkowo zmienił eksportowaną stałą na małą nazwę. W rezultacie aplikacja straciła globalny dostęp do tej stałej, a część funkcjonalności stała się niedostępna.