在Go语言中比较数组。

huangapple go评论90阅读模式
英文:

Comparing arrays in Go language

问题

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

例如,如何比较具有int类型元素的二维数组,或者其他任何类型的数组?

这种比较有多深入?

英文:

How can I correctly compare two arrays in Go?

For instance, how can I compare two dimensional arrays with int entries, or any other types?

How deep is that comparison?

答案1

得分: 41

要比较两个数组,可以使用比较运算符 ==!=。引用链接中的内容:

> 如果数组元素类型的值是可比较的,那么数组值也是可比较的。如果两个数组的对应元素相等,那么它们就是相等的。

由于2D(或ND)数组符合上述要求,你可以以相同的方式进行比较。

问题“这种比较有多深?”对于数组来说是没有意义的。

英文:

To compare two arrays use the comparison operators == or !=. Quoting from the link:

> Array values are comparable if values of the array element type are comparable. Two array values are equal if their corresponding elements are equal.

As a 2D (or ND) array fits the above requirement, you can compare it in the same way.

The question "How deep is that comparison?" doesn't make sense for arrays.

答案2

得分: 31

对于“深度”比较,你可以使用reflect.DeepEqual

DeepEqual用于深度相等性测试。它在可能的情况下使用普通的==相等性,但会扫描数组、切片、映射的元素以及结构体的字段。在映射中,键使用==进行比较,但元素使用深度相等性。DeepEqual正确处理递归类型。只有两个函数都为nil时,它们才相等。空切片不等于nil切片。

示例:

package main

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

func main() {
	a := []byte{}    // 空切片
	b := []byte(nil) // nil切片
	fmt.Printf("%t\n%t", bytes.Equal(a, b), reflect.DeepEqual(a, b))
}

返回:

true
false

需要注意的是,它的速度较慢。

Playground

英文:

For "Deep" comparison, you can use reflect.DeepEqual.

> DeepEqual tests for deep equality. It uses normal == equality where possible but will scan elements of arrays, slices, maps, and fields of structs. In maps, keys are compared with == but elements use deep equality. DeepEqual correctly handles recursive types. Functions are equal only if they are both nil. An empty slice is not equal to a nil slice.

Example:

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))
}

Returns:

>true
false

The caveat is that it's slow.

Playground

答案3

得分: 9

如果你有两个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
}

注意: 这是用于一维数组的代码,但你可以根据需要进行修改以适用于二维数组。

英文:

If you have 2 int slices/arrays try this:

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
}

NOTE: this is for 1D arrays, but you can rewrite it for 2D.

huangapple
  • 本文由 发表于 2013年9月2日 01:53:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/18561219.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定