为了账号安全,请及时绑定邮箱和手机立即绑定

检查两个切片的相等性

检查两个切片的相等性

Go
慕码人2483693 2021-06-04 14:05:35
如何检查两个切片是否相等?
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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


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

}


查看完整回答
反对 回复 2021-06-07
?
DIEA

TA贡献1820条经验 获得超2个赞

你应该使用reflect.DeepEqual()

DeepEqual 是 Go 的 == 运算符的递归松弛。

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

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

如果导出和未导出的相应字段非常相等,则结构值非常相等。

如果两者都为零,则 Func 值非常相等;否则他们就不是完全平等的。

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

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

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

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

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


查看完整回答
反对 回复 2021-06-07
?
富国沪深

TA贡献1790条经验 获得超9个赞

这只是使用在@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

在Go Playground 中尝试


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信