En Go, la portée des variables, fonctions, structures et méthodes est étroitement liée à la casse de la première lettre :
Fichier example.go :
package mypkg var ExportedVar int // accessible dans d'autres packages var unexportedVar int // seulement dans mypkg
Lors de l'importation d'un package, on peut uniquement accéder aux objets exportés.
Meilleures pratiques :
Question : "Peut-on exporter une structure avec des champs non-exportés ? Que se passe-t-il si l'on tente d'utiliser de tels champs dans un autre package ?"
Réponse : Seule la structure commençant par une majuscule est exportée. Tous les champs de la structure commençant par une minuscule seront inaccessibles en dehors du package. Tenter d'accéder à de tels champs depuis l'extérieur générera une erreur de compilation.
Exemple :
// package user type User struct { Name string // Champ exporté age int // Inaccessible en dehors du package user }
Dans un autre package :
u := user.User{Name: "Ivan"} u.age = 42 // Erreur de compilation : age is not accessible
Histoire
Perte de données lors du marshaling JSON : Dans l'API REST, la structure était exportée, mais les champs étaient déclarés non-exportés (avec une minuscule). En conséquence, le marshal en JSON n'incluait pas ces champs, et les utilisateurs de l'API ne recevaient pas les informations nécessaires.
Histoire
Accès nécessaire aux fonctions ne fonctionne pas : L'équipe a extrait des utilitaires utiles dans un package distinct, oubliant de les nommer avec une majuscule. Les fonctions sont restées inaccessibles, nécessitant une réécriture des interfaces.
Histoire
Collision de noms lors de la génération de code : Lors de la génération de code dans un package, des variables avec des noms identiques, différenciés par la casse, ont été utilisées. Un des scripts a accidentellement renommé une constante exportée en un nom en minuscule. En conséquence, l'application a perdu l'accès global à cette constante, et une partie de la fonctionnalité est devenue inaccessible.