programowanieProgramista Go średniego/wyższego poziomu

Opowiedz o cechach pracy z pakietami (packages) i zasięgami widoczności (visibility) w Go. Kiedy i jak należy używać obiektów eksportowanych i nieeksportowanych?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

W Go zasięg zmiennych, funkcji, struktur i metod jest ściśle związany z rejestrem pierwszej litery:

  • Nazwa rozpoczynająca się od wielkiej litery — obiekt jest eksportowany poza pakiet.
  • Nazwa rozpoczynająca się od małej litery — obiekt jest dostępny tylko wewnątrz swojego pakietu.

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:

  • Ukrywać szczegóły implementacji, eksportować tylko potrzebne typy i funkcje.
  • Dla prywatnych stałych/funkcji używać małych nazw.

Pytanie z podstępem

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

Przykłady rzeczywistych błędów z praktyki


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.