Dans le langage Go, le développeur peut créer ses propres types sur la base de types existants ou déclarer des alias pour améliorer la lisibilité du code et l'intégration avec des bibliothèques externes.
Historique de la question :
Go simplifie fondamentalement le système de types en séparant les concepts de création d'un nouveau type (type MyInt int) et d'alias (type MyIntAlias = int). Une confusion fréquente est susceptible de survenir entre eux, ce qui impacte la compatibilité des données entre différentes parties du système.
Problématique :
Si le moyen de déclaration du type est mal choisi, on peut se retrouver avec une multitude d'erreurs implicites : impossibilité de transmettre des données entre les paquets, fonctionnement incorrect avec des bibliothèques externes ou perte de tous les méthodes lors de l'utilisation d'un alias.
Solution :
Exemple de code :
package main import "fmt" type MyInt int // nouveau type func (m MyInt) Double() int { return int(m) * 2 } type MyIntAlias = int // alias de type func main() { var a MyInt = 5 var b MyIntAlias = 10 fmt.Println(a.Double()) // fonctionne //fmt.Println(b.Double()) // erreur : méthode non définie sur int }
Caractéristiques clés :
Peut-on faire un alias de structure et lui ajouter des méthodes différentes de celles de la structure de base ?
Non. Les méthodes ne peuvent être déclarées que pour un nouveau type, pas pour un alias. Un alias est simplement un autre nom pour le même type, une partie du programme ne saura pas « l’extension » du type.
type MyStructAlias = SomeStruct // func (s MyStructAlias) NewMethod() {} // Erreur
Les méthodes du type de base peuvent-elles automatiquement « s'attacher » à l'alias ?
Oui, car pour le compilateur, c'est le même type. Mais on ne peut pas travailler avec de nouvelles méthodes : vous ne pouvez pas ajouter de méthodes uniques à un alias.
type MyString = string // toutes les méthodes et fonctions pour string fonctionnent
Quelle est la différence entre la conversion en type et en alias ?
Lors de la déclaration d'un nouveau type, une conversion explicite est nécessaire : MyInt(x) où x — int. Pour un alias, la conversion n'est pas nécessaire — les types sont complètement interchangeables.
type A int type B = int var x int = 3 var a A = A(x) // conversion explicite var b B = x // implicite, équivalent à int
Un développeur crée un alias de type pour une bibliothèque externe, croyant à tort qu'il est possible d'ajouter ses propres méthodes à ce type et d'encapsuler la logique de transition.
Avantages :
Inconvénients :
L'équipe crée un nouveau type basé sur int pour représenter les identifiants d'utilisateur, afin de protéger la logique métier d'une confusion accidentelle avec d'autres valeurs entières, et ajoute des méthodes spéciales (validateurs, transformateurs).
Avantages :
Inconvénients :