ホームページ >バックエンド開発 >Golang >異なる引数型でメソッドをオーバーロードできますか?

異なる引数型でメソッドをオーバーロードできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 00:29:13200ブラウズ

Can Go Overload Methods with Different Argument Types?

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

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