¿Cómo comparar la igualdad de estructura, corte y mapa en Golang?

En Golang, la función reflect.DeepEqual se usa para comparar la igualdad de estructura, división y mapa en Golang. Se utiliza para comprobar si dos elementos son “profundamente iguales” o no. Profundo significa que estamos comparando los contenidos de los objetos recursivamente. Dos tipos distintos de valores nunca son profundamente iguales. Dos tipos idénticos son profundamente iguales si uno de los siguientes casos es verdadero

1. Los valores de corte son profundamente iguales cuando todo lo siguiente es verdadero:

  • Ambos son nulos o ambos no nulos.
  • Su longitud es la misma.
  • O tienen la misma entrada inicial (es decir, &x[0] == &y[0]) o sus elementos correspondientes (hasta la longitud) son profundamente iguales.

2. Los valores de estructura son profundamente iguales solo si sus campos correspondientes (es decir, tanto exportados como no exportados) son profundamente iguales.

3. Los valores del mapa son profundamente iguales cuando cada uno de los siguientes es cierto:

  • Ambos son nulos o no nulos
  • Su longitud es la misma
  • Sus claves correspondientes tienen valores profundamente iguales.

Nota: Necesitamos importar el paquete reflect para usar DeepEqual.

Sintaxis:

func DeepEqual(x, y interface{}) bool

Ejemplo:

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

Producción:

Struct is equal
Slice is not equal
Map is equal

Sin embargo, cmp.Equal es una mejor herramienta para comparar estructuras. Para usar esto, necesitamos importar el paquete «github.com/google/go-cmp/cmp».

Ejemplo:

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

Producción:

Struct is equal

Publicación traducida automáticamente

Artículo escrito por prakhar7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *