
インターフェイスを実装するポインターのジェネリック型
Go でインターフェイスを操作する場合、ポインターをインターフェイスに渡す必要がある場合があります。インターフェイスを実装する構造体。これは、ジェネリック関数を定義するときに難しい場合があります。
質問:
インターフェイスを実装するポインターのジェネリック型を作成するにはどうすればよいですか?
答え:
オプション 1:インターフェイス定義を変更します
- 型パラメーターを使用してインターフェイスを宣言し、その実装型がその型パラメーターへのポインターである必要があることを指定します。
1 2 3 4 | type A[P any] interface {
SomeMethod()
*P
}
|
ログイン後にコピー
- ハンドラーの変更署名:
1 2 3 4 | func Handler[P any, T A[P]](callback func(result T)) {
result := new (P)
callback(result)
}
|
ログイン後にコピー
オプション 2: インターフェイスをラップする (定義の変更が不可能な場合)
- 元のインターフェイスとその型へのポインタを追加しますパラメータ:
1 2 3 4 | type MyA[P any] interface {
A
*P
}
|
ログイン後にコピー
- ラップされたインターフェイスを受け入れるようにハンドラーの署名を変更します:
1 2 3 4 | func Handler[P any, T MyA[P]](callback func(result T)) {
result := new (P)
callback(result)
}
|
ログイン後にコピー
使用法:
どちらのオプションでも、A インターフェイスを実装する構造体へのポインタを渡すことができます。汎用関数ハンドラー。例:
1 2 3 4 5 6 7 | type Aimpl struct {}
func (a *Aimpl) SomeMethod() {}
func main() {
Handler(func(a *Aimpl) { fmt.Printf( "%#v\n" , a) })
}
|
ログイン後にコピー
以上がGo でインターフェイスを実装するポインターのジェネリック型を作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。