Go 1.20 ではコンパイル時に厳密な比較可能性を確保しますか?

王林
リリース: 2024-02-11 23:20:08
転載
1041 人が閲覧しました

确保 Go 1.20 中编译时的严格可比性?

php エディタ Baicao は、Go 言語バージョン 1.20 の重要な機能、つまりコンパイル時の厳密な比較機能を紹介します。 Go 言語バージョン 1.20 では、コンパイル中に生成されるバイナリ ファイルが異なるコンパイル環境下でも比較できるようにするため、新しいコンパイラ フラグが導入されました。つまり、異なるコンパイル環境で生成されたバイナリは同じ動作と結果を持ち、異なるコンパイル環境によって引き起こされる潜在的な問題が軽減されます。この機能の導入により、Go 言語の信頼性と安定性がさらに向上し、開発者により良い開発エクスペリエンスが提供されます。

質問の内容

Go 1.18 と Go 1.19 では、型 が厳密に比較可能な であること、つまり ==## をサポートしていることをコンパイル時に確認できます。 # 演算子と != 演算子を使用し、これらの演算子 が実行時にパニックを起こさないようにします。 これは、たとえば、不用意にフィールドを構造体に追加して不必要なパニックを引き起こすことを避けるのに役立ちます。

私はちょうど

comparable

でインスタンス化しようとしました : リーリー これは、

comparable

制約の定義により、Go 1.18 および 1.19 で可能です: リーリー Go 1.18 および 1.19 の仕様には、インターフェイスではないが厳密に比較できない型 (

[2]fmt.Stringer

struct { foo any } など) については言及されていません。 、 gc コンパイル コンパイラは、これらを comparable への引数として拒否します。 いくつかの例を含むプレイグラウンド: https://go.dev/play/p/_Ggfdnn6OzZ

Go 1.20 では、

comparable

のインスタンス化は、より広範な比較可能性の概念と一致します。これにより、ensureComparable[Foo] は、 を望まない場合でも をコンパイルします。 Go 1.20 との厳密な比較可能性を静的に保証する方法はありますか?

回避策

Foo

が Go 1.20 で厳密に比較できるかどうかをテストするには、Foo #instantiation によって制約された type パラメータ## を使用します。 ensureComparable リーリー このソリューションはもともと

Robert Griesemer によってここで提案されたものです

. a> それでは、どのように機能するのでしょうか?

Go 1.20 では、

インターフェイスを実装し、

制約を満たす を導入しました : 2 番目のポイントは、インターフェイスとインターフェイスを持つ型が comparable 例外をインスタンス化できるようにすることです。

Go 1.20 では、充足可能性の例外により、型 Foo 自体を

comparable

でインスタンス化できるようになりました。ただし、型パラメータ TFoo ではありません。型パラメータの互換性定義 は異なります : T の型セットには、(インターフェイス フィールドがあるため) 厳密には比較できない型

Foo

が含まれているため、T は ## ではありません#匹敵します ###。 Foo自体も。 このトリックは、Foo の演算子 == および

!=

が実行時にパニックを起こす可能性がある場合に、プログラムのコンパイルを事実上失敗させます。

以上がGo 1.20 ではコンパイル時に厳密な比較可能性を確保しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!