Surcharge de méthodes en Go : restrictions sur les types d'arguments
En Go, les méthodes ayant le même nom et la même arité (nombre d'arguments) peuvent fonctionner sur différents types. Cependant, si vous essayez de déplacer le récepteur de telles méthodes vers les arguments, vous rencontrerez une erreur de compilation.
Considérez le code suivant :
type A struct { Name string } type B struct { Name string } func (a *A) Print() { fmt.Println(a.Name) } func (b *B) Print() { fmt.Println(b.Name) } func main() { a := &A{"A"} b := &B{"B"} a.Print() b.Print() }
Ce code imprime avec succès "A" et "B" à la console. Cependant, si vous modifiez les signatures de méthode comme suit :
func Print(a *A) { fmt.Println(a.Name) } func Print(b *B) { fmt.Println(b.Name) } func main() { a := &A{"A"} b := &B{"B"} Print(a) Print(b) }
Vous rencontrerez une erreur de compilation :
./test.go:22: Print redeclared in this block previous declaration at ./test.go:18 ./test.go:40: cannot use a (type *A) as type *B in function argument
Raison de la restriction
Go ne prend pas en charge la surcharge des fonctions définies par l'utilisateur en fonction de leurs types d'arguments. Cela contraste avec certains autres langages, tels que C , qui autorisent la surcharge basée à la fois sur le nom de la fonction et les types d'arguments.
Dans Go, les fonctions portant le même nom et la même arité doivent avoir des signatures identiques. Si vous souhaitez "surcharger" une fonction sur un paramètre, vous devez utiliser des méthodes. Par exemple, vous pouvez créer une méthode Print pour chacune de vos structures :
func (a A) Print() { fmt.Println(a.Name) } func (b B) Print() { fmt.Println(b.Name) }
Cette approche vous permet d'utiliser le même nom de méthode tout en préservant la sécurité de type de votre code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!