Nouveau sur GoLang, venant de Delphi, C++:
La première fois que j'ai essayé de créer mon propre package dans Go, j'ai suivi toutes les instructions sur la façon de disposer l'espace de travail, etc., mais j'ai continué à obtenir une erreur de compilation:
./myPackage.go:52: undefined: myFunc
Après avoir fouillé un peu, j'ai découvert que le modificateur d'accès public dans Go est obtenu simplement en déclarant une fonction en majuscule. Génial.
Mais quand j'ai commencé à expérimenter avec les classes de conteneur - List
pour commencer, j'ai découvert que je devais déclarer une valeur de retour de référence List comme ceci:
func GetFactors(value *int64) *list.List {...
*list
est en minuscules.
Même chose quand j'ai déclaré une référence locale à une liste - j'ai dû utiliser:
l := list.New()
Encore une fois, minuscule pour list
.
Donc, je suis confus. Quelle est la règle? Les appels de liste et les références sont évidemment publics, sinon je ne pourrais pas les appeler/les utiliser - alors pourquoi sont-ils en minuscules?
Dans ce cas, list
est le nom du package que vous importez via import "container/list"
, et ses membres publics sont en majuscules, comme List
.
La règle est que les fonctions publiques, les types, etc., doivent être en majuscules.
Vous pouvez alias les packages importés comme vous le souhaitez, mais par défaut, il s'agit uniquement du nom de la dernière partie du chemin du package - dans ce cas, list
.
Mise à jour: ce n'est pas la dernière partie du chemin du package. C'est le nom réel du package (qui est souvent la même chose).
Remarque: à partir de Go 1.5 (Q2/Q3 2015), vous obtiendrez également une importation "protégée" (nommée "interne")!
Voir Go 1.4 doc :
Le système de packages de Go facilite la structuration des programmes en composants avec des limites propres, mais il n'y a que deux formes d'accès: local (non exporté) et global (exporté).
Parfois, on souhaite avoir des composants qui ne sont pas exportés, par exemple pour éviter d'acquérir des clients d'interfaces pour du code qui fait partie d'un référentiel public mais qui n'est pas destiné à être utilisé en dehors du programme auquel il appartient.Le langage Go n'a pas le pouvoir d'appliquer cette distinction, mais à partir de Go 1.4, la commande
go
introduit un mécanisme pour définir les packages "internes" qui ne peuvent pas être importés par des packages en dehors du sous-arbre source dans lequel ils résident. .Pour créer un tel package, placez-le dans un répertoire nommé
internal
ou dans un sous-répertoire d'un répertoire nomméinternal
.
Lorsque la commandego
voit une importation d'un package avecinternal
dans son chemin, elle vérifie que le package effectuant l'importation se trouve dans l'arborescence enracinée chez le parent de l'interne annuaire.
Par exemple, un package.../a/b/c/internal/d/e/f
ne peut être importé que par du code dans l'arborescence de répertoires dont la racine est.../a/b/c
.
Il ne peut pas être importé par code dans.../a/b/g
ou dans tout autre référentiel.Pour Go 1.4, le mécanisme de package interne est appliqué pour le référentiel Go principal ;
à partir de la version 1.5 et ultérieure, il sera appliqué pour tout référentiel .
Remarque: le Go Spec pour le nom du package ne mentionne pas qu'un nom de package est toujours en minuscules.
Il indique seulement que son nom est représenté par un identifiant , qui est composé d'une collection de " lettre ".
Ce fil clarifie:
Les noms de packages peuvent être n'importe quoi, vous pouvez les démarrer avec une lettre majuscule si vous le souhaitez.
Mais la convention est entièrement en minuscules, ce qui, je suppose, vous évite d'avoir à taper une lettre majuscule.L'exportabilité en majuscules/minuscules n'est pas vraiment pertinente pour les packages car vous ne pouvez pas avoir de package privé.
Une fois que vous le savez, il est plus facile de reconnaître:
list.New()
pour un constructeur (toujours au niveau du package, pour construire une instance initialisée d'un type), comme os.NewFile()
,list.List
pour un type de structure de la liste des packages (l'autre type de structure de ce même package étant list.Element
).