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

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

Susan Sarandon
リリース: 2024-12-02 00:29:13
オリジナル
139 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート