ホームページ  >  記事  >  バックエンド開発  >  汎用 Go を使用して型パラメーターへのゼロ以外のポインターをインスタンス化するにはどうすればよいですか?

汎用 Go を使用して型パラメーターへのゼロ以外のポインターをインスタンス化するにはどうすればよいですか?

WBOY
WBOY転載
2024-02-11 17:36:11394ブラウズ

如何使用泛型 Go 实例化类型参数的非零指针?

php エディタ Xigua は、Go 言語で汎用インスタンス化型パラメータのゼロ以外のポインタを使用する方法を紹介します。 Go 言語では、ジェネリックスはコードの柔軟性と再利用性を高める強力な機能です。ジェネリック関数またはメソッドでゼロ以外のポインターをインスタンス化する必要がある場合、型アサーションとリフレクションを使用してこれを実現できます。これらの手法を使用すると、実行時に型パラメーターの特定の型に基づいてゼロ以外のポインター インスタンスを作成できるため、ジェネリックの柔軟性と多用途性が実現します。具体的な実装方法を詳しく見ていきましょう。

質問内容

golang/go:masterで型パラメータが利用できるようになったので、試してみることにしました。型パラメータの提案では見つからない制限に遭遇したようです。 (あるいは私が見逃していたに違いありません)。

インターフェイスの型制約を使用してジェネリック型の値のスライスを返す関数を作成したいと考えています。渡された型がポインター レシーバーを備えた実装である場合、それをどのようにインスタンス化すればよいでしょうか?

リーリー

上記の SetGetterSlice() 関数が *Count 型を T として使用して呼び出される場合、このコードは Set(v)# を呼び出します。 # 混乱が発生するのは # です。 (Go2go プレイグラウンド) 基本的にコードは nil ポインターのスライスを作成するため、驚くことではありません: リーリー

同じ質問のバリエーション

このアイデアは機能しません。ポイントされた値をインスタンス化する簡単な方法が見つからないようです。

  1. out[i] = new(T) は、型チェッカーが T を認識することを期待しているのに *T を返すため、コンパイルが失敗します。
  2. *new(T) の呼び出しはコンパイルされますが、new(T)**Count を返すため、同じ実行時パニックが発生します。この場合、ポインターはCount はまだ nil です。
  3. 戻り値の型をポインター フラグメントから
  4. T に変更すると、コンパイルが失敗します:
  5. リーリー ###解決###
これまでに私が見つけた唯一の解決策は、コンストラクターをジェネリック関数に渡すことを要求することです。でも、それは間違っていて、少し退屈な気がします。

func F(T Interface{})() []T

が完全に有効な構文である場合、なぜこれが必要なのでしょうか?

リーリー ###まとめ### 私の質問 (優先順位順):

私は何か明らかなことを見落としていませんか?

これは Go のジェネリックスの制限ですか?これで十分でしょうか?

    この制限は既知ですか? それとも Go プロジェクトで問題を提起する必要がありますか?
  1. 回避策
  2. 基本的に、
T をそのポインター型に変換できるようにするには、制約に型パラメーターを追加する必要があります。最も基本的な形式では、この手法は次のようになります (匿名制約あり):

リーリー

プレイグラウンド:

https://www.php.cn/link/24aef8cb3281a2422a59b51659f1ad2e

段階的な解決策

制約

SetGetter はすでに型パラメーター V

を宣言しているため、上記の例を少し変更します。 リーリー

次に、SetGetterSlice 関数を定義します。その型パラメータは T any で、その目的は制約

SetGetter

をインスタンス化することだけです。 その後、式 &out[i] をポインター型にキャストし、ポインター レシーバーでメソッドを正常に呼び出すことができます。 リーリー 完全なプログラム: CFE57E536C89530D9A8C38E10967A10D

SetGetterSlice には、元の V

に加えて

T

(ポインタ レシーバを持つ型) と

の 3 つの型パラメータが必要になるため、これはより冗長になります。 PT (新しい制約)。ただし、関数を呼び出すときは、3 番目の型推論を介して、PT SetGetter[V,T] #T# をインスタンス化するために必要な型パラメーター V および ## を省略できます。 ## はすべて既知です: リーリー プレイグラウンド:https://www.php.cn/link/6b061fc28f7473418a006dfa832708b1

以上が汎用 Go を使用して型パラメーターへのゼロ以外のポインターをインスタンス化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。