Golang での異なる型によるメソッドのオーバーロード
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 Print(a *A) { fmt.Println(a.Name) } func Print(b *B) { fmt.Println(b.Name) }
この結果は次のようになります。コンパイル エラー:
./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 が引数の型に基づく関数のオーバーロードをサポートしていないためです。これは、同じ名前の関数を異なる引数の型で定義できないことを意味します。代わりに、関数に一意の名前を付けるか、1 つのパラメーター (レシーバー) のみを「オーバーロード」する場合はメソッドを使用する必要があります。
したがって、レシーバーに基づいてメソッドをオーバーロードすることは許可されますが、レシーバーに基づいてオーバーロードすることは許可されません。引数の型。
以上がGo メソッドは引数の型に基づいてオーバーロードできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。