php エディタ Baicao は、Go 言語バージョン 1.20 の重要な機能、つまりコンパイル時の厳密な比較機能を紹介します。 Go 言語バージョン 1.20 では、コンパイル中に生成されるバイナリ ファイルが異なるコンパイル環境下でも比較できるようにするため、新しいコンパイラ フラグが導入されました。つまり、異なるコンパイル環境で生成されたバイナリは同じ動作と結果を持ち、異なるコンパイル環境によって引き起こされる潜在的な問題が軽減されます。この機能の導入により、Go 言語の信頼性と安定性がさらに向上し、開発者により良い開発エクスペリエンスが提供されます。
Go 1.18 と Go 1.19 では、型 が厳密に比較可能な であること、つまり ==## をサポートしていることをコンパイル時に確認できます。 # 演算子と
!= 演算子を使用し、これらの演算子
が実行時にパニックを起こさないようにします。
これは、たとえば、不用意にフィールドを構造体に追加して不必要なパニックを引き起こすことを避けるのに役立ちます。
私はちょうど
comparable でインスタンス化しようとしました :
リーリー
これは、
制約の定義により、Go 1.18 および 1.19 で可能です:
リーリー
Go 1.18 および 1.19 の仕様には、インターフェイスではないが厳密に比較できない型 (
や 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。
リーリー
このソリューションはもともと
. a> それでは、どのように機能するのでしょうか?
Go 1.20 では、インターフェイスを実装し、
制約を満たす を導入しました : 2 番目のポイントは、インターフェイスとインターフェイスを持つ型が comparable 例外をインスタンス化できるようにすることです。
Go 1.20 では、充足可能性の例外により、型 Foo
自体を
でインスタンス化できるようになりました。ただし、型パラメータ T
は Foo
ではありません。型パラメータの互換性定義 は異なります
:
T の型セットには、(インターフェイス フィールドがあるため) 厳密には比較できない型
が含まれているため、T
は ## ではありません#匹敵します ###。 Foo
自体も。
このトリックは、Foo
の演算子 ==
および
が実行時にパニックを起こす可能性がある場合に、プログラムのコンパイルを事実上失敗させます。
以上がGo 1.20 ではコンパイル時に厳密な比較可能性を確保しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。