値の等価性を求める連鎖比較の代替方法
3 つの値が等しいかどうかを比較する場合、if a == b == c を使用すると、次の結果が得られます。型の不一致によるコンパイルエラー。 a == b && a == c が有効な代替手段である場合、面倒に見える可能性があります。この記事では、3 つの値の等価性をエレガントにチェックするためのいくつかの創造的な方法を検討します。
オプション 1: セットとしてマップ
3 つの値をキーとして使用してマップを作成する、マップの長さが 1 かどうかを検証することで、すべての値が等しいかどうかを確認できます。このアプローチは柔軟で、3 つ以上の値に対応できます。
<code class="go">if len(map[interface{}]int{a: 0, b: 0, c: 0}) == 1 { fmt.Println("Map set: all 3 are equal") }</code>
オプション 2: 配列
Go の配列は、スライスとは異なり、比較できます。配列と 3 つの値の対応する要素を比較することで、等しいかどうかをチェックできます。
<code class="go">if [2]interface{}{a, b} == [2]interface{}{b, c} { fmt.Println("Arrays: all 3 are equal") }</code>
オプション 3: トリッキーなマップ
マップの動作を活用して、次のことを行うことができます。 b == c の単一の比較を実行し、3 つの値の全体的な同等性のプロキシとして b の結果の値にアクセスします。
<code class="go">if map[interface{}]bool{a: b == c}[b] { fmt.Println("Tricky map: all 3 are equal") }</code>
オプション 4: 匿名構造体
Go の構造体の値も同様です。 2 つのフィールドを持つ匿名構造体を作成し、3 つの値を含む構造体を比較し、等しいかどうかを確認します。
<code class="go">if struct{ a, b interface{} }{a, b} == struct{ a, b interface{} }{b, c} { fmt.Println("Anon structs: all 3 are equal") }</code>
オプション 5: ヘルパー関数
ヘルパー関数を定義して、任意の数の値をシード値と繰り返し比較することでそれらの値が等しいかどうかを確認できます。
<code class="go">func AllEquals(v ...interface{}) bool { if len(v) > 1 { a := v[0] for _, s := range v { if a != s { return false } } } return true }</code>
以上がGo で 3 つの値が等しいかどうかをエレガントにチェックするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。