Golang での関数とメソッドのオーバーロード
Golang では、異なる型で動作する場合に限り、同じ名前とアリティを持つメソッドを作成できます。 。関数のオーバーロードとして知られるこの手法により、簡潔で直感的なコードが可能になります。ただし、メソッドの受信側が引数リストに移動されると、コンパイル エラーが発生します。
有効なメソッドのオーバーロードを示す次のコード スニペットを考えてみましょう。
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) }
この例では、2 つのPrint という名前のメソッドは、異なる型 A と B に対して定義されています。これらのメソッドは同じ名前とアリティを共有しますが、異なる構造体型で動作します。このコードはエラーなしでコンパイルされ、目的の出力が生成されます。
ただし、Print メソッドの受信側が引数リストに移動されると、エラーが発生します。
func Print(a *A) { fmt.Println(a.Name) } func Print(b *B) { fmt.Println(b.Name) }
この変更により、次のようになります。コンパイル エラー:
このブロックで再宣言された印刷
前の宣言<ファイルへのパス>:18
関数の引数では (型 A) を型 B として使用できません
このエラーの理由は、Go が次の関数をサポートしていないことにあります。引数の型に基づいた関数のオーバーロード。 Go では、異なる型で動作する場合を除き、同じ名前とアリティを持つ複数の関数を許可しません。この設計上の決定により、関数呼び出しが明確になり、コンパイル中および実行中の潜在的な混乱が回避されます。
この制限を回避するには、開発者は実装ごとに異なる関数名を使用するか、単一のパラメーター (レシーバー) を受け取るメソッドを使用できます。 )。関数の代わりにメソッドを使用することにより、Go はレシーバーの型に基づいた「オーバーロード」を可能にし、さまざまな構造体の型に対してポリモーフィックな動作を可能にします。
以上がGo は他の言語と同様に関数のオーバーロードをサポートできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。