ホームページ >バックエンド開発 >Golang >Go メソッドは引数の型に基づいてオーバーロードできますか?

Go メソッドは引数の型に基づいてオーバーロードできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 16:08:13763ブラウズ

Can Go Methods Be Overloaded Based on Argument Types?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。