ProgrammazioneSviluppatore Go Middle/Lead

Racconta le peculiarità del lavoro con i pacchetti (packages) e la visibilità (visibility) in Go. Quando e come dovrebbero essere utilizzati oggetti esportabili e non esportabili?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Go la visibilità di variabili, funzioni, strutture e metodi è strettamente legata al registro della prima lettera:

  • Un nome che inizia con una lettera maiuscola — l'oggetto è esportato al di fuori del pacchetto.
  • Un nome che inizia con una lettera minuscola — l'oggetto è accessibile solo all'interno del proprio pacchetto.

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:

  • Nascondere i dettagli dell'implementazione, esportare solo i tipi e le funzioni necessari.
  • Utilizzare nomi in minuscolo per costanti/funzioni private.

Domanda trabocchetto

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

Esempi di errori reali dalla pratica


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.