この投稿は、GoLang での開発に必要な基本を共有するシリーズの一部です。
== または != 演算子を使用した論理比較には、それほど謎はありません。または、コードは値が同じか異なるかを比較します。
ただし、比較対象について知っておくべき重要な詳細がいくつかあります。
最初に、これらの演算子で何が比較できるのかを知る必要があります。これを知るための最も明白な場所は、Go ドキュメントのコンパレーターに関するセクションです
もう 1 つのオプションは、Go のジェネリックス実装とともに追加された同等のインターフェイスを調べることです。このインターフェイスを実装するすべての型は同等です。
したがって、基本的に Go で定義されたすべてのプリミティブ型 (文字列、数値 (int、float、complex)、bool など) は比較可能です。
一部の型には、比較できるかどうかの条件があります。これは、構造体、スライス、チャネルの場合です。
要素も比較可能な場合にのみ比較可能です。
興味深いのは、Go がコンパイル レベルでこれを検証し、実行時エラーを回避できることです。次に例を示します。
//Esse código compila e a comparação funciona: func main() { test1 := struct { name string }{} test2 := struct { name string }{} if test1 == test2 { fmt.Println("Funciona") } }
上記のコードでは、同等の属性を持つ 2 つの構造体を作成しており、比較は機能します。
//Esse código não compila func main() { test1 := struct { name string attributes map[string]string }{} test2 := struct { name string attributes map[string]string }{} if test1 == test2 { fmt.Println("Cade?") } }
このコードは、無効な操作エラーによりコンパイルに失敗します。
これは、Go ではマップが同等の型ではないために発生します。
構造体を == で比較できると非常に便利です。これらの型はモデリングをカスタマイズするためです。
ただし、比較不可能な型を使用する場合でも、コードを簡素化する方法がいくつかあり、これを知っていれば、本当に退屈な条件を記述する必要がなくなります。
それでは、学校システムで作業していて、次のような比較できない構造体があると想像してみましょう:
type student struct { ID int name string age int course string attributes map[string]string }
良い点は、この構造体には ID フィールドがあるため、永続化されたデータを扱う場合が非常に簡単になります。
ここで、まだ一時的なデータを操作している場合を想像してみてください。たとえば、ファイルを読み取っていて、このデータを永続化する前に何らかの処理を行う必要がある場合です。
フィールドごとに比較するオプションが常にあり、まったく便利ではありませんが、機能します。ただし、次のように構造体の構成を利用できます:
func main() { type identity struct { name string age int course string } type student struct { ID int identity attributes map[string]string } s1 := student{ identity: identity{ name: "Chuck", age: 10, course: "golang", }, attributes: map[string]string{ "last_score": "10", }, } s2 := student{ identity: identity{ name: "Chuck", age: 10, course: "golang", }, attributes: map[string]string{ "last_score": "20", }, } s3 := student{ identity: identity{ name: "Chuck", age: 12, course: "golang", }, attributes: map[string]string{ "last_score": "20", }, } if s1.identity == s2.identity { fmt.Println("Achou", s1) } if s1.identity != s3.identity { fmt.Println("Não achou") } }
このコードの代わりに、次のような条件を作成することもできます。
if s1.name == s2.name && s1.age == s2.age && s1.course == s2.course { fmt.Println("Achou", s1) }
混乱を避けるためにこれを関数に抽出することもできますが、それでもこれらの比較を維持する必要があります。
コンポジションを上手に活用すると、コードが大幅に簡素化されます。
以上が基本的な Golang - 同等性の比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。