ジェネリックを使用して、渡された値に特定のフィールドが含まれていることを確認する方法はありますか?これは、多くの開発者がジェネリックを使用するときによく遭遇する問題です。 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 サイトの他の関連記事を参照してください。