Dans le langage Go, l'organisation du code à travers les paquets (packages) et le système de visibilité joue un rôle clé dans la modularité, la réutilisation et l'encapsulation de la logique.
Contrairement à de nombreux langages classiques avec héritage orienté objet, Go a été conçu dès le départ autour de modules simples — des paquets avec des règles d'exportation et d'importation précises. Cet héritage se fonde sur la philosophie du minimalisme, de la simplicité et d'un contrôle strict des dépendances.
Si les composants n'ont pas de visibilité claire, cela entraîne un chaos dans les noms, il devient difficile de suivre les dépendances entre les fichiers, augmentant le risque d'utilisation accidentelle de détails d'implémentation privés. Des erreurs dans l'organisation de l'exportation peuvent mener à des bogues difficiles à déboguer et à une rupture de l'encapsulation.
En Go, chaque fichier appartient obligatoirement à un paquet (package nom). L'intégralité de la portée en Go est définie comme suit :
Toutes les fonctions, types, variables, constantes, méthodes dont le nom commence par une majuscule sont exportées du paquet et accessibles à d'autres paquets après importation. Les autres ne sont accessibles qu'à l'intérieur du paquet.
Exemple de structure :
project/
│
├── main.go // package main
└── mathutil/
└── mathutil.go // package mathutil
Exemple de code :
// mathutil/mathutil.go package mathutil // Public - fonction exportée func Sum(a, b int) int { return a + b } // private - fonction non exportée func subtract(a, b int) int { return a - b }
// main.go package main import ( "fmt" "project/mathutil" ) func main() { fmt.Println(mathutil.Sum(2, 3)) // 5 // fmt.Println(mathutil.subtract(3,2)) // Erreur de compilation ! subtract n'est pas exporté }
Caractéristiques clés :
Peut-on exporter une variable ou une fonction déclarée avec une lettre minuscule par d'autres mécanismes ?
Non. En Go, il n'y a pas de mots clés comme public, private, tout est déterminé uniquement par la première lettre du nom (catégorie unicode — lettre majuscule).
Les fonctions d'un fichier d'un paquet peuvent-elles utiliser des fonctions privées d'un autre fichier du même paquet ?
Oui, la portée est limitée au niveau du paquet, et non du fichier. Tous les éléments privés sont accessibles dans tous les fichiers d'un même paquet.
Exemple de code :
// mathutil/helpers.go package mathutil func hiddenHelper() int { return 42 } // mathutil/mathutil.go package mathutil func UseHelper() int { return hiddenHelper() // accessible ! }
Peut-on créer la même fonction ou le même type avec le même nom à l'intérieur d'un même paquet dans plusieurs fichiers ?
Non, il y aura une erreur de compilation — à l'intérieur d'un paquet, les noms doivent être uniques, même s'ils sont déclarés dans différents fichiers.
xxx_test.go dans le même paquet)Une grande équipe place toutes les fonctions d'assistance et types dans le paquet util avec l'export de tout :
Avantages :
Inconvénients :
L'équipe divise soigneusement le code par modules selon les domaines d'activité, exporte uniquement l'API :
Avantages :
Inconvénients :