📜  如何比较 Golang 中结构、切片和映射的相等性?

📅  最后修改于: 2021-10-25 02:52:13             🧑  作者: Mango

在 Golang 中, reflect.DeepEqual函数用于比较Golang中 struct、slice 和 map 的相等性。它用于检查两个元素是否“深度相等”。 Deep 意味着我们正在递归地比较对象的内容。两种截然不同的价值观永远不会完全相等。如果以下情况之一为真,则两个相同的类型非常相等

1.当以下所有条件都为真时,切片值非常相等:

  • 它们都是零或都非零。
  • 它们的长度是一样的。
  • 它们要么具有相同的初始条目(即 &x[0] == &y[0]),要么它们对应的元素(直到长度)非常相等。

2.仅当其对应的字段(即导出和未导出)深度相等时,结构值才深度相等。

3.当以下每一项都为真时,地图值非常相等:

  • 他们都是零或非零
  • 它们的长度是一样的
  • 它们对应的键具有非常相等的值

注意:我们需要导入reflect包才能使用DeepEqual。

句法:

func DeepEqual(x, y interface{}) bool

例子:

// Golang program to compare equality
// of struct, slice, and map
package main
  
import (
    "fmt"
    "reflect"
)
  
type structeq struct {
    X int
    Y string
    Z []int
}
  
func main() {
    s1 := structeq{X: 50,
        Y: "GeeksforGeeks",
        Z: []int{1, 2, 3},
    }
    s2 := structeq{X: 50,
        Y: "GeeksforGeeks",
        Z: []int{1, 2, 3},
    }
      
    // comparing struct
    if reflect.DeepEqual(s1, s2) {
        fmt.Println("Struct is equal")
    } else {
        fmt.Println("Struct is not equal")
    }
  
    slice1 := []int{1, 2, 3}
    slice2 := []int{1, 2, 3, 4}
      
    // comparing slice
    if reflect.DeepEqual(slice1, slice2) {
        fmt.Println("Slice is equal")
    } else {
        fmt.Println("Slice is not equal")
    }
  
    map1 := map[string]int{
        "x": 10,
        "y": 20,
        "z": 30,
    }
    map2 := map[string]int{
        "x": 10,
        "y": 20,
        "z": 30,
    }
      
    // comparing map
    if reflect.DeepEqual(map1, map2) {
        fmt.Println("Map is equal")
    } else {
        fmt.Println("Map is not equal")
    }
}

输出:

Struct is equal
Slice is not equal
Map is equal

但是, cmp.Equal是比较结构的更好工具。要使用它,我们需要导入“github.com/google/go-cmp/cmp”包。

例子:

package main
  
import (
    "fmt"
    "github.com/google/go-cmp/cmp"
)
  
type structeq struct {
    X int
    Y string
    Z []int
}
  
func main() {
    s1 := structeq{X: 50,
        Y: "GeeksforGeeks",
        Z: []int{1, 2, 3},
    }
    s2 := structeq{X: 50,
        Y: "GeeksforGeeks",
        Z: []int{1, 2, 3},
    }
    // comparing struct
    if cmp.Equal(s1, s2) {
        fmt.Println("Struct is equal")
    } else {
        fmt.Println("Struct is not equal")
    }
}

输出:

Struct is equal