用Go语言比较数组

ang*_*her 29 arrays go

如何在Go中正确比较两个数组?

例如,如何将二维数组与int条目或任何其他类型进行比较?

这种比较有多深?

zzz*_*zzz 30

要比较两个数组,请使用比较运算符 ==!=.引用链接:

如果数组元素类型的值具有可比性,则数组值是可比较的.如果它们的相应元素相等,则两个数组值相等.

由于2D(或ND)阵列符合上述要求,您可以以相同的方式对其进行比较.

问题是"这种比较有多深?" 对数组没有意义.

  • 不切片只能与nil进行比较; http://play.golang.org/p/Kk8osjPm8n (24认同)
  • @jnml这是真的.只是很多人感到困惑,因为在Go [] int {1,2,3}中是一个切片但是[3] int {1,2,3}是一个数组. (11认同)
  • @Tom:你在哪里看到任何切片?它们从未在问题中提及,也未在此答案中提及. (6认同)

Int*_*net 20

对于"深度"比较,您可以使用reflect.DeepEqual.

DeepEqual测试深度相等.它尽可能使用normal == equality,但会扫描数组,切片,映射和结构域的元素.在地图中,键与==进行比较,但元素使用深度相等.DeepEqual正确处理递归类型.只有当它们都是零时,函数才是相等的.空切片不等于零切片.

例:

package main

import (
    "bytes"
    "fmt"
    "reflect"
)

func main() {
    a := []byte{}    // empty slice
    b := []byte(nil) // nil slice
    fmt.Printf("%t\n%t", bytes.Equal(a, b), reflect.DeepEqual(a, b))
}
Run Code Online (Sandbox Code Playgroud)

返回:


需要注意的是,它很慢.

操场

  • @MaciejSzulik这不是一个警告,这是一个要求.列表不应该像集合一样. (5认同)
  • 还有一个额外的警告,两个数组必须具有完全相同的顺序。 (3认同)

Tom*_*Tom 6

如果您有2个int切片/阵列,请尝试以下方法:

func IntArrayEquals(a []int, b []int) bool {
    if len(a) != len(b) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

注意:这适用于1D阵列,但您可以将其重写为2D.

  • 谢谢.有没有内置功能? (5认同)
  • @angry_gopher bytes.Equal() (2认同)