Go での異なる型のメソッドのオーバーロード
Go では、名前は同じでレシーバーの型が異なるメソッドを定義できます。たとえば、次のコードは正常に動作します:
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() }
このコードは目的の出力を出力します:
A B
ただし、メソッド シグネチャを変更してレシーバーを引数に移動すると、このメソッドを実行すると、コンパイル エラーが発生します:
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) }
コンパイル エラーは:
./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
このエラーの理由は、Go が引数の型でのユーザー定義関数のオーバーロードをサポートしていないことです。これは、同じ名前で引数の型が異なる 2 つの関数を持つことはできないことを意味します。
代わりに、異なる関数名を使用したり、メソッドを使用して 1 つのパラメーター (レシーバー) のみを「オーバーロード」することができます。
以上が異なる引数型でメソッドをオーバーロードできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。