ホームページ > バックエンド開発 > Golang > Go が引数の型に基づく関数のオーバーロードをサポートしないのはなぜですか?

Go が引数の型に基づく関数のオーバーロードをサポートしないのはなぜですか?

Linda Hamilton
リリース: 2024-12-01 07:13:18
オリジナル
796 人が閲覧しました

Why Doesn't Go Support Function Overloading Based on 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 は、引数の型に基づいたユーザー定義関数のオーバーロードをサポートしていません。これは、関数名と引数の型の両方に基づいてオーバーロードを許可する C などの他の言語とは対照的です。

Go では、同じ名前とアリティを持つ関数は同一のシグネチャを持つ必要があります。 1 つのパラメーターで関数を「オーバーロード」したい場合は、メソッドを使用する必要があります。たとえば、構造体ごとに Print メソッドを作成できます。

func (a A) Print() {
  fmt.Println(a.Name)
}

func (b B) Print() {
  fmt.Println(b.Name)
}
ログイン後にコピー

このアプローチにより、コードのタイプ セーフを維持しながら同じメソッド名を使用できます。

以上がGo が引数の型に基づく関数のオーバーロードをサポートしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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