鉴于运算符 ==
和 !=
不是一个选项,我如何检查两个切片是否相等?
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 许可协议
鉴于运算符 ==
和 !=
不是一个选项,我如何检查两个切片是否相等?
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 许可协议
你应该使用 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 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
5 回答2.2k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答920 阅读✓ 已解决
2 回答2.2k 阅读
您需要遍历切片中的每个元素并进行测试。切片的相等性未定义。但是,如果要比较类型
[]byte
的值,则有一个bytes.Equal
函数。