在Go中比较两个片断的方法

96 阅读1分钟

Go中的切片没有可比性,所以不能进行简单的平等比较a == b 。为了检查两个片子是否相等,编写一个自定义函数,在一个循环中比较它们的长度和相应的元素。

注意,比较两个数组可以的

a := [2]string{"strawberry", "raspberry"}
b := [2]string{"strawberry", "raspberry"}
fmt.Printf("slices equal: %t\n", a == b)
package main
import "fmt"
func stringSlicesEqual(a, b []string) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
func main() {
a := []string{"strawberry", "raspberry"}
b := []string{"strawberry", "raspberry"}
fmt.Printf("slices equal: %t\n", stringSlicesEqual(a, b))
b = append(b, "test")
fmt.Printf("slices equal: %t\n", stringSlicesEqual(a, b))
}

输出

slices equal: true
slices equal: false

你也可以使用 reflect.DeepEqual()函数,对两个值进行递归比较,这意味着它遍历并检查每一级对应的数据值是否相等。然而,这种解决方案比在一个循环中比较数值要慢得多,也不安全。在使用包的时候,一个一般的经验法则是:它应该和 reflect包时的一般经验是:应该谨慎使用,除非绝对必要,否则应避免使用。

package main
import (
"fmt"
"reflect"
)
func main() {
a := []string{"strawberry", "raspberry"}
b := []string{"strawberry", "raspberry"}
fmt.Printf("slices equal: %t\n", reflect.DeepEqual(a, b))
b = append(b, "test")
fmt.Printf("slices equal: %t\n", reflect.DeepEqual(a, b))
}

输出

slices equal: true
slices equal: false