Go 比较两个 Slice 是否相等


开发中经常会遇到需要比较两个 slice 包含的元素是否完全相等的情况,一般来说有两个思路:

  • reflect 比较的方法
  • 循环遍历比较的方法

reflect 比较的方法

func StringSliceReflectEqual(a, b []string) bool {
    return reflect.DeepEqual(a, b)
}

这个写法很简单,就是直接使用 reflect 包的 reflect.DeepEqual 方法来比较 a 和 b 是否相等。

循环遍历比较的方法

func StringSliceEqual(a, b []string) bool {
    if len(a) != len(b) {
        return false
    }
    if (a == nil) != (b == nil) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}

以上是我们项目中的使用的用来比较字符串 slice 是否相等的一个函数,代码逻辑很简单;先比较长度是否相等,否则 false;再比较两个 slice 是否都为 nil 或都不为 nil,否则 false;再比较对应索引处两个 slice 的元素是否相等,否则
false;前面都为是则 true。

需要注意

if (a == nil) != (b == nil) {
    return false
}

这段代码是必须的,虽然如果没有这段代码,在大多数情况下,上面的函数可以正常工作,但是增加这段代码的作用是与
reflect.DeepEqual 的结果保持一致:

[]int{} != []int(nil)
分享:

评论