ProgrammationDéveloppeur Go Middle/Lead

Parlez-nous des particularités du travail avec les packages et la visibilité en Go. Quand et comment utiliser des objets exportés et non-exportés ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

En Go, la portée des variables, fonctions, structures et méthodes est étroitement liée à la casse de la première lettre :

  • Un nom commençant par une majuscule — l'objet est exporté en dehors du package.
  • Un nom commençant par une minuscule — l'objet est accessible uniquement à l'intérieur de son propre package.

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 :

  • Cacher les détails d'implémentation, n'exporter que les types et fonctions nécessaires.
  • Utiliser des noms en minuscule pour les constantes/fonctions privées.

Question piège

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

Exemples d'erreurs réelles de la pratique


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.