英文:
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
需要注意的是,它的速度较慢。
英文:
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.
答案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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论