首页 >后端开发 >Golang >如何在 Go 中优雅地检查三个值的相等性?

如何在 Go 中优雅地检查三个值的相等性?

Susan Sarandon
Susan Sarandon原创
2024-11-04 06:12:29444浏览

How to Elegantly Check Equality of Three Values in Go?

价值相等的链式比较的替代方案

比较三个值的相等性时,使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn