ホームページ >バックエンド開発 >Golang >ジェネリックを使用して、渡された値に特定のフィールドが含まれていることを確認する方法はありますか?

ジェネリックを使用して、渡された値に特定のフィールドが含まれていることを確認する方法はありますか?

王林
王林転載
2024-02-10 16:27:22687ブラウズ

ジェネリックを使用して、渡された値に特定のフィールドが含まれていることを確認する方法はありますか?

ジェネリックを使用して、渡された値に特定のフィールドが含まれていることを確認する方法はありますか?これは、多くの開発者がジェネリックを使用するときによく遭遇する問題です。 PHP では、型制約とインターフェイス実装を通じてこの機能を実現できます。まず、型制約を使用して、渡された値がクラスのインスタンスであることを確認できます。次に、インターフェイスを使用して特定のフィールドの仕様を定義し、渡された値にこれらのフィールドが含まれていることを確認できます。こうすることで、コード内でジェネリックスを使用し、渡された値が特定のフィールド要件を確実に満たすことができます。このようにして、ジェネリックをより効果的に活用し、コードの信頼性とセキュリティを確保できます。

質問内容

Goでid ​​intなどのフィールドを持つ値を受け取る汎用関数を定義しようとしています。いくつかの方法を試しましたが、どれもうまくいかないようです。以下は私が試した例です。

リーリー

これはプレイグラウンドのリンクです: https://gotipplay.golang.org/p/2i4rsucwagf

上記の例では、print 関数に渡される各値に、関数内でもアクセスできるプロパティ id ​​int があることを確認したいと考えています。インターフェースでメソッドを定義せずにこれを実現する方法はありますか(例: getid() int)?

解決策

インターフェイスでメソッドを定義せずにこれを実現する方法はありますか(例: getid() int)?

いいえ、インターフェースでメソッドを定義する必要があります。

go 1.18 のジェネリックスの実装は構造体型をサポートしていませんが、プリミティブ型パラメーターの提案ではサポートが示唆されています。共用体のパブリック フィールドにアクセスするには、この説明も参照してください。

それにもかかわらず、あなたの例から起こりやすい誤解を指摘する価値があると思います。近似 ~t (チルダ型) の意味は、「基になる型が t である型のセット」を意味します。 p>

今、次のように書きます:

リーリー

これは、その基になる型 が正確に struct{ id int } であることを意味します。とにかく、これにはフィールド id ​​int 他のものを持つ構造体は含まれません。例えば。 type foo struct {基になる型の id int; 名前付き文字列}struct { id int; 名前付き文字列} であり、struct{ id int } ではないため、いずれにしても制約を満たすことはできません。

現在の時間パラメーターの実装には、一部の構造タイプを指定する構文がありません。 提案インターフェース制約にフィールド用語 (および入力用語とメソッド) を追加すると、オンラインになったのを覚えています:

リーリー

これにより、チルダ ~ の意味を損なうことなく、やりたいことが実現します。ただし、これは go 1.18 には含まれません。

以上がジェネリックを使用して、渡された値に特定のフィールドが含まれていることを確認する方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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