Go値の比較

タイプ別の比較可能性

基本的なデータ型は、==そして!=演算子:整数値、浮動小数点数字、繁雑数字、ブール値値、ストリング値、絶え間ない値。

アレイ同等の要素タイプが含まれている場合、値は同等です

ポインタ値は同等です。

チャネル値は同等です。

インターフェース値は同等です。

比較するインターフェース値は、動的タイプが同等である場合にのみ機能します。

関数値、スライス値と地図値はない同等、それらはとのみ比較することができますnil、特別な場合として。

比較のルール

Go仕様から:

  • ブール値値は同等です。 2つのブール値は、両方の場合は等しいtrueまたは両方false

  • 整数通常の方法で、値は比較可能で順序付けられます。

  • 浮動小数点値は、によって定義されているように、比較可能で順序付けられていますIEEE-754標準。

  • 繁雑値は同等です。 2つの複素数値uとvは、両方が等しい場合に等しいreal(u) == real(v)andimag(u)== imag(v) `。

  • ストリング値は比較可能であり、字句的にバイト単位で順序付けられます。

  • ポインタ値は同等です。 2つのポインター値が同じ変数を指している場合、または両方に値がある場合、2つのポインター値は等しいnil。異なるゼロサイズ変数へのポインターは、等しい場合と等しくない場合があります。

  • チャネル値は同等です。 2つのチャネル値は、同じ呼び出しで作成された場合、または両方に値がある場合は等しいnil

  • インターフェース値は同等です。 2つのインターフェイス値が等しい動的タイプと等しい動的値がある場合、または両方に値がある場合nil

  • の値x非インターフェースタイプXと値tインターフェースタイプTタイプの値が比較可能である場合X同等であり、X実装T。それらは等しい場合tの動的タイプはと同じですXtの動的な値はに等しいx

  • 構造体すべてのフィールドが比較可能である場合、値は比較可能です。対応する非空白フィールドが等しい場合、2つの構造体値は等しくなります。

  • アレイ配列要素タイプの値が同等である場合、値は同等です。対応する要素が等しい場合、2つの配列値は等しくなります。

比較に失敗する

構造体にタイプが比較できないフィールドが含まれている場合、比較時にコンパイル時エラーが発生します。

比較できないタイプの比較:入力refect.DeepEqual()

ザ・reflectstdlibパッケージはreflect.DeepEqual()2つの型を取り、ブール値を返す関数:

func DeepEqual(x, y interface{}) bool

異なるタイプの値が完全に等しくなることは決してないため、2つの異なるタイプを渡すと、常に次のようになります。false

アレイ対応する要素が完全に等しい場合、値は非常に等しくなります。

構造体対応するフィールドが非常に等しい場合、値は非常に等しくなります。

機能両方がそうである場合、値は深く等しいnil;そうでなければ、それらは深く等しくありません。

インターフェースそれらが深く等しい具体的な値を保持する場合、値は深く等しい。

地図次のすべてが当てはまる場合、値は完全に等しくなります。-両方ともnilまたは両方非nil-それらは同じ長さです-それらは同じマップオブジェクトであるか、対応するキー(Goの等式を使用して一致)が深く等しい値にマップされます。

ポインタGoを使用して値が等しい場合、値は非常に等しくなります。==演算子、またはそれらが深く等しい値を指している場合。

スライス次のすべてが当てはまる場合、値は完全に等しくなります。-両方ともnilまたは両方非nil-それらは同じ長さです-同じ基になる配列の同じ初期エントリを指します(つまり、&x[0] == &y[0])またはそれらの対応する要素(長さまで)は完全に等しい。

ゼロ以外の空のスライスとnilスライス(たとえば、[]byte{}そして[]byte(nil))は深く等しくありません。

その他の値-数字ブール文字列、およびチャネル-Goの==演算子を使用して等しい場合、それらは完全に等しくなります。

リストする価値のあるいくつかの避けられない「特別な」ケース:値がそれ自体と等しくない可能性があります:-のでfuncタイプ-浮動小数点であるためNaN値-それはアレイ構造体、またはインターフェースそのような値を含む

ポインタ値は、Goを使用して等しいと比較されるため、そのような問題のある値を指している、または含んでいる場合でも、常にそれ自体と等しくなります。==演算子、そしてそれは内容に関係なく、深く等しくなるための十分条件です。

同じことが当てはまりますスライスそしてマップ:もしxそしてy同じスライスまたは同じマップである場合、コンテンツに関係なく、それらは完全に等しくなります。


その他のチュートリアル: