ホームページ > バックエンド開発 > Golang > Go でインターフェイスを実装するポインターのジェネリック型を作成する方法

Go でインターフェイスを実装するポインターのジェネリック型を作成する方法

Linda Hamilton
リリース: 2024-12-29 20:40:18
オリジナル
401 人が閲覧しました

How to Create a Generic Type for a Pointer Implementing an Interface in Go?

インターフェイスを実装するポインターのジェネリック型

Go でインターフェイスを操作する場合、ポインターをインターフェイスに渡す必要がある場合があります。インターフェイスを実装する構造体。これは、ジェネリック関数を定義するときに難しい場合があります。

質問:

インターフェイスを実装するポインターのジェネリック型を作成するにはどうすればよいですか?

答え:

オプション 1:インターフェイス定義を変更します

  1. 型パラメーターを使用してインターフェイスを宣言し、その実装型がその型パラメーターへのポインターである必要があることを指定します。
type A[P any] interface {
    SomeMethod()
    *P
}
ログイン後にコピー
  1. ハンドラーの変更署名:
func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}
ログイン後にコピー

オプション 2: インターフェイスをラップする (定義の変更が不可能な場合)

  1. 元のインターフェイスとその型へのポインタを追加しますパラメータ:
type MyA[P any] interface {
    A
    *P
}
ログイン後にコピー
  1. ラップされたインターフェイスを受け入れるようにハンドラーの署名を変更します:
func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}
ログイン後にコピー

使用法:

どちらのオプションでも、A インターフェイスを実装する構造体へのポインタを渡すことができます。汎用関数ハンドラー。例:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}

func main() {
    Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
}
ログイン後にコピー

以上がGo でインターフェイスを実装するポインターのジェネリック型を作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート