php エディタ Xigua は、Go 言語で汎用インスタンス化型パラメータのゼロ以外のポインタを使用する方法を紹介します。 Go 言語では、ジェネリックスはコードの柔軟性と再利用性を高める強力な機能です。ジェネリック関数またはメソッドでゼロ以外のポインターをインスタンス化する必要がある場合、型アサーションとリフレクションを使用してこれを実現できます。これらの手法を使用すると、実行時に型パラメーターの特定の型に基づいてゼロ以外のポインター インスタンスを作成できるため、ジェネリックの柔軟性と多用途性が実現します。具体的な実装方法を詳しく見ていきましょう。
golang/go:master
で型パラメータが利用できるようになったので、試してみることにしました。型パラメータの提案では見つからない制限に遭遇したようです。 (あるいは私が見逃していたに違いありません)。
インターフェイスの型制約を使用してジェネリック型の値のスライスを返す関数を作成したいと考えています。渡された型がポインター レシーバーを備えた実装である場合、それをどのようにインスタンス化すればよいでしょうか?
リーリー上記の SetGetterSlice()
関数が *Count
型を T
として使用して呼び出される場合、このコードは Set(v)# を呼び出します。 # 混乱が発生するのは # です。 (Go2go プレイグラウンド) 基本的にコードは
nil ポインターのスライスを作成するため、驚くことではありません:
リーリー
は、型チェッカーが
T を認識することを期待しているのに
*T を返すため、コンパイルが失敗します。
の呼び出しはコンパイルされますが、
new(T) が
**Count を返すため、同じ実行時パニックが発生します。この場合、ポインターは
Count はまだ
nil です。
に変更すると、コンパイルが失敗します:
リーリー
###まとめ###
私の質問 (優先順位順):
これは Go のジェネリックスの制限ですか?これで十分でしょうか?
https://www.php.cn/link/24aef8cb3281a2422a59b51659f1ad2e
SetGetter はすでに型パラメーター V
を宣言しているため、上記の例を少し変更します。 リーリー次に、SetGetterSlice
関数を定義します。その型パラメータは T any
で、その目的は制約
をインスタンス化することだけです。
その後、式 &out[i]
をポインター型にキャストし、ポインター レシーバーでメソッドを正常に呼び出すことができます。
リーリー
完全なプログラム:
CFE57E536C89530D9A8C38E10967A10D
SetGetterSlice には、元の
V
T
(ポインタ レシーバを持つ型) と の 3 つの型パラメータが必要になるため、これはより冗長になります。 PT (新しい制約)。ただし、関数を呼び出すときは、3 番目の型推論を介して、
PT SetGetter[V,T] #T# をインスタンス化するために必要な型パラメーター
V および ## を省略できます。 ## はすべて既知です:
リーリー
プレイグラウンド:
https://www.php.cn/link/6b061fc28f7473418a006dfa832708b1
以上が汎用 Go を使用して型パラメーターへのゼロ以外のポインターをインスタンス化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。