如何检查两个切片是否相等?
slice can only be compared to nil
,并且想知道是否存在惯用的golang方法来检查切片是否相等...如果该语言未定义相等运算符,那么我觉得提出最有效的方法是合理的完成它。问题不需要结束
如何检查两个切片是否相等?
slice can only be compared to nil
,并且想知道是否存在惯用的golang方法来检查切片是否相等...如果该语言未定义相等运算符,那么我觉得提出最有效的方法是合理的完成它。问题不需要结束
Answers:
您需要遍历切片中的每个元素并进行测试。未定义切片的相等性。但是,bytes.Equal
如果要比较type的值,则有一个函数[]byte
。
func testEq(a, b []Type) bool {
// If one is nil, the other must also be nil.
if (a == nil) != (b == nil) {
return false;
}
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
for i, v := range a { if v != b[i] { return false } }
。
您应该使用reflect.DeepEqual()
DeepEqual是Go的==运算符的递归松弛。
DeepEqual报告x和y是否“深度相等”,定义如下。如果满足以下情况之一,则两个相同类型的值将完全相等。不同类型的值永远不会完全相等。
当数组的对应元素深度相等时,数组值深度相等。
如果结构的值对应的字段(导出的和未导出的)都非常相等,则该值非常相等。
如果两者均为零,则Func值非常相等;否则,它们就不会完全平等。
如果接口值具有完全相等的具体值,则它们是高度相等的。
如果映射值是相同的映射对象,或者它们具有相同的长度,并且它们的对应键(使用Go相等性进行匹配)映射为深度相等的值,则它们是深度相等的。
如果指针值使用Go的==运算符相等,或者它们指向深度相等的值,则它们的深度相等。
当满足以下所有条件时,切片值将完全相等:它们均为nil或均为非nil,它们具有相同的长度,并且它们指向同一基础数组的相同初始条目(即&x [0 ] ==&y [0])或它们相应的元素(最大长度)相等。请注意,非nil空片和nil片(例如[] byte {}和[] byte(nil))并不完全相等。
如果使用Go的==运算符,其他值(数字,布尔值,字符串和通道)将完全相等。
这只是使用@VictorDeryagin答案中给出的reflect.DeepEqual()的示例。
package main
import (
"fmt"
"reflect"
)
func main() {
a := []int {4,5,6}
b := []int {4,5,6}
c := []int {4,5,6,7}
fmt.Println(reflect.DeepEqual(a, b))
fmt.Println(reflect.DeepEqual(a, c))
}
结果:
true
false
如果有两个[]byte
,则使用bytes.Equal比较它们。Golang文档说:
Equal返回一个布尔值,报告a和b的长度是否相同并且包含相同的字节。nil参数等效于一个空切片。
用法:
package main
import (
"fmt"
"bytes"
)
func main() {
a := []byte {1,2,3}
b := []byte {1,2,3}
c := []byte {1,2,2}
fmt.Println(bytes.Equal(a, b))
fmt.Println(bytes.Equal(a, c))
}
这将打印
true
false
而现在,这里是https://github.com/google/go-cmp这
旨在成为
reflect.DeepEqual
比较两个值在语义上是否相等的更强大,更安全的选择。
package main
import (
"fmt"
"github.com/google/go-cmp/cmp"
)
func main() {
a := []byte{1, 2, 3}
b := []byte{1, 2, 3}
fmt.Println(cmp.Equal(a, b)) // true
}
如果您有兴趣编写测试,那么github.com/stretchr/testify/assert
您就是您的朋友。
在文件的开头导入库:
import (
"github.com/stretchr/testify/assert"
)
然后在测试中执行以下操作:
func TestEquality_SomeSlice (t * testing.T) {
a := []int{1, 2}
b := []int{2, 1}
assert.Equal(t, a, b)
}
提示错误为:
Diff:
--- Expected
+++ Actual
@@ -1,4 +1,4 @@
([]int) (len=2) {
+ (int) 1,
(int) 2,
- (int) 2,
(int) 1,
Test: TestEquality_SomeSlice
assert.Equal
内部使用reflect.DeepEqual
,这可能会使您的测试运行速度变慢,最终使您的管道运行缓慢。
==
运营商在去定义只为某些类型的,所以此外,这个问题也是合法的。