インターフェイス実装への汎用ポインター
Go では、インターフェイスへのポインターを受け入れる汎用関数を定義するのが難しい場合があります。 SomeMethod() を持つインターフェイス A を考えます:
type A interface { SomeMethod() }
そして、構造体ポインターとして A の実装があると仮定します:
type Aimpl struct {} func (a *Aimpl) SomeMethod() {}
関数を受け取るジェネリック関数 Handler を作成するにはA パラメータを使用する場合は、次のように定義することが望ましいでしょう。
func Handler[T A](callback func(result T)) { // Essentially what I'd like to do is result := &Aimpl{} (or whatever T is) callback(result) }
ただし、これにはいくつかの制約があります。
任意の型パラメータを使用して試行します
最初は、ポインタ実装を許可するために型パラメータを使用してインターフェイスを定義できるように見えるかもしれません:
type MyA[T any] interface{ A *T }
ただし、次の場合は失敗します。 error:
result does not implement interface. It's a pointer to a type, not a type
解決策: Type Parameterized Interface
これを解決するには、実装型がポインターであることを必要とする型パラメーターを使用してインターフェイスを宣言できます。その型パラメータに:
type A[P any] interface { SomeMethod() *P }
このインターフェイスを使用すると、Handler 関数は次のようになります。変更されました:
func Handler[P any, T A[P]](callback func(result T)) { result := new(P) callback(result) }
これで、コードは期待どおりにハンドラーを呼び出すことができます:
Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
Interface Wrapper を使用した代替
の定義の場合は変更できません。別の方法としては、カスタムのインターフェース:
type MyA[P any] interface { A *P }
それに応じてハンドラー関数を変更します:
func Handler[P any, T MyA[P]](callback func(result T)) { result := new(P) callback(result) }
どちらのソリューションでも、インターフェース実装へのポインターを受け入れる汎用関数の作成が可能です。
以上がインターフェイス実装へのポインターを受け入れる汎用 Go 関数を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。