检查两个切片的相等性

新手上路,请多包涵

鉴于运算符 ==!= 不是一个选项,我如何检查两个切片是否相等?

 package main

import "fmt"

func main() {
    s1 := []int{1, 2}
    s2 := []int{1, 2}
    fmt.Println(s1 == s2)
}

这不会编译:

无效操作:s1 == s2(slice只能和nil比较)

原文由 wei2912 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 956
2 个回答

您需要遍历切片中的每个元素并进行测试。切片的相等性未定义。但是,如果要比较类型 []byte 的值,则有一个 bytes.Equal 函数。

 func testEq(a, b []Type) bool {
    if len(a) != len(b) {
        return false
    }
    for i := range a {
        if a[i] != b[i] {
            return false
        }
    }
    return true
}

原文由 Stephen Weinberg 发布,翻译遵循 CC BY-SA 4.0 许可协议

你应该使用 reflect.DeepEqual()

DeepEqual 是 Go 的 == 运算符的递归放宽。

DeepEqual 报告 x 和 y 是否“深度相等”,定义如下。如果以下情况之一适用,则相同类型的两个值深度相等。不同类型的值永远不会完全相等。

当对应的元素深度相等时,数组值深度相等。

如果结构值的相应字段(导出的和未导出的)深度相等,则结构值深度相等。

如果两者都为零,则 Func 值深度相等;否则他们并不完全平等。

如果接口值具有深度相等的具体值,则它们是深度相等的。

如果映射值是相同的映射对象,或者如果它们具有相同的长度并且它们对应的键(使用 Go 相等性匹配)映射到深度相等的值,则映射值是深度相等的。

如果指针值使用 Go 的 == 运算符相等,或者如果它们指向深度相等的值,则指针值深度相等。

当以下所有条件为真时,切片值深度相等:它们均为 nil 或均为非 nil,它们具有相同的长度,并且它们指向同一底层数组的相同初始条目(即 &x[0 ] == &y[0]) 或它们对应的元素(直到长度)深度相等。请注意,非 nil 空切片和 nil 切片(例如,[]byte{} 和 []byte(nil))并不完全相等。

其他值——数字、布尔值、字符串和通道——如果它们使用 Go 的 == 运算符相等,则它们是深度相等的。

原文由 Victor Deryagin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题