golang中判断两个slice是否相等
时间:2021-04-19 来源:互联网
今天PHP爱好者给大家带来golang中判断两个slice是否相等与判断值下的 数组是否相等,希望对需要的朋友有所帮助!
在golang中我们可以轻松地通过==
来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了。
slice相等的定义
我们选择最常见的需求,也就是当两个slice的类型和长度相同,且相等下标的值也是相等的,比如:
a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}
上述代码中a
和b
是相等的,c
因为长度和a
不同所以不相等,d
因为元素的排列顺序和a
不同所以也不相等。
判断两个[]byte是否相等
为什么要单独将[]byte列举出来呢?
因为标准库提供了优化的比较方案,不再需要我们造轮子了:
package mainimport (
"bytes"
"fmt")func main() {
a := []byte{0, 1, 3, 2}
b := []byte{0, 1, 3, 2}
c := []byte{1, 1, 3, 2}
fmt.Println(bytes.Equal(a, b))
fmt.Println(bytes.Equal(a, c))}
使用reflect判断slice(数组)是否相等
在判断类型不是[]byte的slice时,我们还可以借助reflect.DeepEqual
,它用于深度比较两个对象包括它们内部包含的元素是否都相等:
func DeepEqual(x, y interface{}) bool
DeepEqual reports whether x and y are “deeply equal,” defined as follows. Two values of identical type are deeply equal if one of the following cases applies. Values of distinct types are never deeply equal.
…
Slice values are deeply equal when all of the following are true: they are both nil or both non-nil, they have the same length, and either they point to the same initial entry of the same underlying array (that is, &x[0] == &y[0]) or their corresponding elements (up to length) are deeply equal. Note that a non-nil empty slice and a nil slice (for example, []byte{} and []byte(nil)) are not deeply equal.
这段话的意思不难理解,和我们在本文最开始时讨论的如何确定slice相等的原则是一样的,只不过它借助了一点运行时的“黑魔法”。
看例子:
package mainimport (
"fmt"
"reflect")func main() {
a := []int{1, 2, 3, 4}
b := []int{1, 3, 2, 4}
c := []int{1, 2, 3, 4}
fmt.Println(reflect.DeepEqual(a, b))
fmt.Println(reflect.DeepEqual(a, c))}
手写判断
在golang中使用reflect通常需要付出性能代价,如果我们确定了slice的类型,那么自己实现slice的相等判断相对来说也不是那么麻烦:
func testEq(a, b []int) 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}
测试代码:
package main import "fmt" func main() { a := []int{1, 2, 3, 4} b := []int{1, 3, 2, 4} c := []int{1, 2, 3, 4} fmt.Println(testEq(a, b)) fmt.Println(testEq(a, c))}
以上就是golang中判断两个slice是否相等的详细内容,更多请关注php爱好者其它相关文章!
-
向僵尸开炮食堂玩法攻略 2024-11-28
-
大数据Spark是什么?Spark是用来干嘛的?Spark和Hadoop的区别 2024-11-28
-
剑与骑士团蝴蝶boss打法攻略 2024-11-28
-
剑灵2自由PVP模式玩法介绍 2024-11-28
-
OpenAPI是什么意思 OpenAPI规范基本信息 OpenAPI是干什么用的 2024-11-28
-
心动小镇家园攻略 2024-11-28