Go でインターフェイスを実装するポインターのジェネリック型
Go では、インターフェイスを操作するときに、以下の操作を行うジェネリック関数を作成すると便利です。これらのインターフェイスを実装するデータ型について。ただし、インターフェイスがポインター型を表す場合、ポインターのジェネリック型を決定するのは困難な場合があります。
これに対処するために、Go は、型パラメーターを使用してインターフェイスを宣言するメカニズムを提供します。これにより、期待されるインターフェイスの定義が可能になります。実装型はその型パラメータへのポインタになります。たとえば、次のインターフェイスについて考えてみましょう。
type A interface { SomeMethod() }
次のような構造体ポインタを介してこのインターフェイスを実装している場合、
type Aimpl struct {} func (a *Aimpl) SomeMethod() {}
を渡そうとすると問題が発生する可能性があります。 A パラメーターを持つ関数を予期する汎用関数への Aimpl へのポインター。この理由は、ジェネリック関数が A インターフェイスを実装する型へのポインターではなく、A インターフェイスを実装する型を予期しているためです。
これを解決するには、インターフェイス定義を変更して型パラメーターを指定できます。 :
type A[P any] interface { SomeMethod() *P }
これは、インターフェースが、それを実装する型が型パラメーター P へのポインターであることを期待していることを示します。
次に、次のことを行う必要があります。変更されたインターフェイス型を受け入れるようにジェネリック関数のシグネチャを調整します:
func Handler[P any, T A[P]](callback func(result T)) { result := new(P) callback(result) }
ジェネリック関数は、型 T のパラメーターを持つ関数を受け取ります。これは、変更された A インターフェイスを実装する必要があります。 Aimpl へのポインターを使用して関数を呼び出すと、実装型が正しく識別され、期待どおりに実行されます。
ただし、元の A インターフェイスの定義を変更できない場合は、独自のインターフェイスを作成できます。 type パラメータを含むラッパー インターフェイス:
type MyA[P any] interface { A *P }
元のインターフェイスをラップすることで、次と同じアプローチを採用できます。 before:
func Handler[P any, T MyA[P]](callback func(result T)) { result := new(P) callback(result) }
これにより、必要な汎用動作を維持しながら、元の A インターフェイスを実装するポインター型を操作できるようになります。
以上がGo でインターフェイスを実装するポインターのジェネリック型を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。