再利用可能なタイプセーフGOコードのジェネリックを活用します
1.18に移動する前に、コードの再利用性を達成することは、多くの場合、インターフェイスを使用して関与します。ジェネリックは、よりエレガントなソリューションを提供します。これらを使用すると、タイプの安全性を犠牲にすることなく、さまざまなタイプで動作できる機能とデータ構造を作成できます。これは、四角い括弧[]
で示されるタイプパラメーターの使用によって達成されます。
簡単な例:スライス内の最大要素を見つける機能。ジェネリックがなければ、さまざまなタイプ( MaxInt
、 MaxFloat64
など)の個別の関数を記述する必要があります。ジェネリックを使用すると、1つの関数を記述できます。
[T constraints.Ordered]
パーツに注意してください。これはconstraints
constraints.Ordered
実装するタイプに制約された型パラメーターT
を宣言します。これにより、 Max
関数で匹敵するタイプのみを使用できるようになり、ランタイムエラーが防止されます。この制約は、コンパイル時間にタイプの安全性を強制します。 constraints.Ordered
満たさないタイプでMax
を使用しようとすると、順序付けされた順序で、コンパイラはエラーを発行します。これは、実行時にのみチェックされたインターフェイスへの依存度よりも大幅に改善されています。独自のカスタム制約も作成して、特定のタイプ要件を定義できます。
GOのジェネリックの重要な利点
GO 1.18にジェネリックを導入すると、以前のバージョンにわたっていくつかの重要な改善がもたらされました。
一般的なGOデータ構造の一般的な実装
多くの一般的なGOデータ構造は、一般的な実装から大きな恩恵を受けます。
Stack
:スタックを一般的に実装して、あらゆるタイプの要素を保存し、タイプの安全性を確保し、タイプアサーションの必要性を回避できます。Queue
:スタックと同様に、一般的なキューは、タイプの安全性を維持しながら、あらゆるタイプの要素を保存することができます。List
(リンクリスト):リンクリストを一般的にすることができ、さまざまなタイプの要素を含むノードを保存できます。Map
(既に汎用): Goの組み込みmap
は既にやや汎用的ですが(任意のタイプの値を保存できます)、キータイプもパラメーターであり、本質的に一般的です。ただし、マップの制限(たとえば、等式オペレーターを実装しない限り、キーのカスタムタイプをサポートしていません)は、明示的に宣言されたジェネリックのより強力な機能の必要性を強調しています。Tree
(例、バイナリ検索ツリー):一般的なツリーを使用すると、ツリーの構造と特性を維持しながら、さまざまなタイプの値でノードを保存できます。Set
:一般的なセット実装により、同等のタイプの要素を保存することができ、一意の要素のコレクションを管理するタイプセーフの方法を提供します。これらのデータ構造を実装すると、コードの複製が一般的に減少し、保守性が大幅に向上します。たとえば、一般的なStack
実装は次のようになる場合があります。
制約とタイプパラメーターの効果的な取り扱い
制約とタイプパラメーターの効果的な使用は、GOで堅牢で再利用可能なジェネリックコードを書くために重要です。
constraints
パッケージは、 Ordered
、 Integer
、 Float
などの事前に定義された制約を提供します。インターフェイスを使用して独自のカスタム制約を定義することもできます。[]
四角いブラケット内で宣言されます。一般的なコードで使用できるタイプを表します。このPrintValue
関数は、 Stringer
インターフェイスを実装するタイプのみを受け入れます。
T int | string
)。ただし、インターフェイスを使用してこれをシミュレートできます。たとえば、 int
またはstring
値を処理する関数が必要な場合は、両方のタイプが満たすインターフェイスを定義できます。制約とタイプパラメーターを慎重に選択して定義することにより、GOで柔軟でタイプセーフ、高度に再利用可能なジェネリックコードを作成できます。一般的な機能とデータ構造の柔軟性と安全の両方を確保するために、必要な制約を徹底的に考慮することを忘れないでください。
以上がジェネリックを使用して、GOでより再利用可能でタイプセーフコードを書くにはどうすればよいですか? (1.18に行くと仮定)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。