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
Linda HamiltonOriginal
2024-12-01 07:13:18817Durchsuche

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()
}

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)
}

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

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)
}

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!

Stellungnahme:
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