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