Heim > Backend-Entwicklung > Golang > Warum unterstützt Go das Überladen von Funktionen nicht basierend auf Argumenttypen?

Warum unterstützt Go das Überladen von Funktionen nicht basierend auf Argumenttypen?

Linda Hamilton
Freigeben: 2024-12-01 07:13:18
Original
796 Leute haben es durchsucht

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

Methodenüberladung in Go: Einschränkungen für Argumenttypen

In Go können Methoden mit demselben Namen und derselben Arität (Anzahl der Argumente) ausgeführt werden auf verschiedene Typen. Wenn Sie jedoch versuchen, den Empfänger solcher Methoden auf die Argumente zu verschieben, wird ein Kompilierungsfehler auftreten.

Bedenken Sie den folgenden Code:

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()
}
Nach dem Login kopieren

Dieser Code gibt erfolgreich „A“ aus. und „B“ zur Konsole. Wenn Sie jedoch die Methodensignaturen wie folgt ändern:

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)
}
Nach dem Login kopieren

Es tritt ein Kompilierungsfehler auf:

./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
Nach dem Login kopieren

Grund für die Einschränkung

Go unterstützt keine Überladung benutzerdefinierter Funktionen basierend auf ihren Argumenttypen. Dies steht im Gegensatz zu einigen anderen Sprachen wie C, die eine Überladung basierend auf Funktionsnamen und Argumenttypen ermöglichen.

In Go müssen Funktionen mit demselben Namen und derselben Arität identische Signaturen haben. Wenn Sie eine Funktion auf einen Parameter „überladen“ möchten, müssen Sie Methoden verwenden. Sie könnten beispielsweise für jede Ihrer Strukturen eine Print-Methode erstellen:

func (a A) Print() {
  fmt.Println(a.Name)
}

func (b B) Print() {
  fmt.Println(b.Name)
}
Nach dem Login kopieren

Dieser Ansatz ermöglicht es Ihnen, denselben Methodennamen zu verwenden und gleichzeitig die Typsicherheit Ihres Codes zu wahren.

Das obige ist der detaillierte Inhalt vonWarum unterstützt Go das Überladen von Funktionen nicht basierend auf Argumenttypen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage