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!