检查两个切片的相等性

我如何检查两片是否相等?

您需要循环切片中的每个元素并进行testing。 没有定义切片的平等。 但是,如果您正在比较types[]byte值,则有一个bytes.Equal函数。

 func testEq(a, b []Type) bool { if a == nil && b == nil { return true; } 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 } 

你应该使用reflect.DeepEqual() 。

 package main import ( "fmt" "reflect" ) func main() { a := []int {1,2,3} b := []int {1,2,3} c := []int {1,2,2} fmt.Println(reflect.DeepEqual(a, b)) fmt.Println(reflect.DeepEqual(a, c)) } 

结果:

 true false 

DeepEqual是Go的==运算符的recursion放松。

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

当它们的相应元素深度相等时,数组值是非常相等的。

如果它们相应的字段(导出和未导出)深度相等,那么结构值是相等的。

如果两者都是零,则Func值是相等的。 否则他们并不是很平等。

如果他们拥有深刻的同等的具体价值,那么界面价值就是相等

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

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

如果满足以下所有条件,则切片值是相等的:它们都是零,或者都是非零,它们具有相同的长度,并且它们指向相同基础数组的相同初始条目(即&x [0 ] ==&y [0])或它们相应的元素(最大长度)是非常相等的。 请注意,非零空片和零片(例如,[] byte {}和[] byte(nil))并不完全相等。

其他值 – 数字,布尔值,string和通道 – 如果使用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 

而且你还可以使用Sprintf

 package main import "fmt" type color string func (color) String() string { return "black" } func main() { slice1 := []color{color("red"), color("green")} slice2 := []color{color("blue"), color("yellow")} if fmt.Sprintf("%v", slice1) == fmt.Sprintf("%v", slice2) { println("not really") } }