Maison > développement back-end > Golang > Pourquoi Go ne prend-il pas en charge la surcharge de fonctions en fonction des types d'arguments ?

Pourquoi Go ne prend-il pas en charge la surcharge de fonctions en fonction des types d'arguments ?

Linda Hamilton
Libérer: 2024-12-01 07:13:18
original
796 Les gens l'ont consulté

Why Doesn't Go Support Function Overloading Based on Argument Types?

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()
}
Copier après la connexion

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)
}
Copier après la connexion

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
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal