价值相等的链式比较的替代方案
比较三个值的相等性时,使用 if a == b == c 会导致由于类型不匹配而导致编译错误。虽然如果 a == b && a == c 是一个有效的替代方案,但它可能会显得很麻烦。本文探讨了几种优雅地检查三个值是否相等的创造性方法。
选项 1:映射为集合
通过创建一个以三个值作为键的映射,我们可以通过验证映射的长度是否为 1 来检查所有值是否相等。这种方法很灵活,可以容纳三个以上的值。
<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 中的数组是可比较的,与切片不同。通过将数组与三个值中的相应元素进行比较,我们可以检查是否相等。
<code class="go">if [2]interface{}{a, b} == [2]interface{}{b, c} { fmt.Println("Arrays: all 3 are equal") }</code>
选项 3:棘手的映射
我们可以利用映射的行为执行 b == c 的单次比较,然后访问 b 的结果值作为三个值总体相等的代理。
<code class="go">if map[interface{}]bool{a: b == c}[b] { fmt.Println("Tricky map: all 3 are equal") }</code>
选项 4:匿名结构
Go 中的结构体值也是可比较的。我们可以创建一个包含两个字段的匿名结构体,比较包含三个值的结构体,并检查是否相等。
<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 中优雅地检查三个值的相等性?的详细内容。更多信息请关注PHP中文网其他相关文章!