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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-29 20:40:18398ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。