In Go la visibilità di variabili, funzioni, strutture e metodi è strettamente legata al registro della prima lettera:
File example.go:
package mypkg var ExportedVar int // accessibile in altri pacchetti var unexportedVar int // solo in mypkg
Quando si importa un pacchetto, è possibile accedere solo agli oggetti esportati.
Best practice:
Domanda: "È possibile esportare una struttura con campi non esportati? Cosa succede se si tenta di utilizzare tali campi in un altro pacchetto?"
Risposta: Solo la struttura con la lettera maiuscola è esportata. Tutti i campi della struttura che iniziano con una lettera minuscola non saranno accessibili al di fuori del pacchetto. Un tentativo di accedere a tali campi dall'esterno genererà un errore di compilazione.
Esempio:
// package user type User struct { Name string // Campo esportato age int // Non accessibile al di fuori del pacchetto user }
In un altro pacchetto:
u := user.User{Name: "Ivan"} u.age = 42 // Errore di compilazione: age is not accessible
Storia
Perdita di dati durante il marshalling json: Nell'API REST la struttura è stata esportata, ma i campi sono stati resi non esportati (con la lettera minuscola). Di conseguenza, il marshal in JSON non includeva tali campi e gli utenti dell'API non ricevevano le informazioni necessarie.
Storia
Accesso non riuscito a funzioni necessarie: Il team ha spostato utilità utili in un pacchetto separato, dimenticando di rendere i loro nomi con la lettera maiuscola. Le funzioni sono rimaste non accessibili e sono stati necessari cambiamenti nelle interfacce.
Storia
Collisione di nomi durante la generazione automatica del codice: Durante la generazione del codice in un pacchetto, sono state utilizzate variabili con nomi identici, differenti solo per il registro. Uno degli script ha accidentalmente rinominato una costante esportata in un nome minuscolo. Di conseguenza, l'applicazione ha perso accesso globale a questa costante e parte della funzionalità è diventata non disponibile.