Функция reflect.DeepEqual

Функция reflect.DeepEqual выполняет глубокое сравнение двух значений произвольных типов. Она возвращает true, если значения глубоко равны, и false в противном случае. Первым параметром функция принимает первое значение для сравнения, вторым параметром — второе значение. В отличие от оператора ==, DeepEqual рекурсивно обходит составные структуры данных, сравнивая их элементы.

Синтаксис

goreflect.DeepEqual(a, b)

Пример

Давайте сравним два слайса с одинаковыми элементами:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []int{1, 2, 3, 4, 5}
  s2 := []int{1, 2, 3, 4, 5}
  res := reflect.DeepEqual(s1, s2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Пример

Давайте сравним две структуры с одинаковыми полями:

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  p1 := Person{Name: "John", Age: 30}
  p2 := Person{Name: "John", Age: 30}
  res := reflect.DeepEqual(p1, p2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Пример

Давайте сравним два слайса с разными элементами:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []int{1, 2, 3, 4, 5}
  s2 := []int{1, 2, 3, 4, 6}
  res := reflect.DeepEqual(s1, s2)
  fmt.Println(res)
}

Результат выполнения кода:

gofalse

Пример

Давайте сравним два среза с разной длиной:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []string{"a", "b", "c", "d", "e"}
  s2 := []string{"a", "b", "c"}
  res := reflect.DeepEqual(s1, s2)
  fmt.Println(res)
}

Результат выполнения кода:

gofalse

Пример

Давайте сравним две карты с одинаковыми парами ключ-значение:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m1 := map[string]int{"a": 1, "b": 2, "c": 3}
  m2 := map[string]int{"a": 1, "b": 2, "c": 3}
  res := reflect.DeepEqual(m1, m2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Пример

Давайте сравним две вложенные структуры:

gopackage main

import (
  "fmt"
  "reflect"
)

type Address struct {
  City  string
  Country string
}

type Employee struct {
  Name  string
  Age   int
  Address Address
}

func main() {
  e1 := Employee{
    Name: "Alice",
    Age:  25,
    Address: Address{
      City:  "Moscow",
      Country: "Russia",
    },
  }
  e2 := Employee{
    Name: "Alice",
    Age:  25,
    Address: Address{
      City:  "Moscow",
      Country: "Russia",
    },
  }
  res := reflect.DeepEqual(e1, e2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Пример

Давайте сравним два указателя на одну и ту же переменную:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  p1 := &x
  p2 := &x
  res := reflect.DeepEqual(p1, p2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Пример

Давайте сравним два указателя на разные переменные с одинаковым значением:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  y := 42
  p1 := &x
  p2 := &y
  res := reflect.DeepEqual(p1, p2)
  fmt.Println(res)
}

Результат выполнения кода:

gofalse

Смотрите также

  • функцию reflect.TypeOf,
    которая возвращает тип переменной
  • функцию reflect.ValueOf,
    которая возвращает значение переменной в виде reflect.Value
  • тип reflect.Value,
    предоставляющий методы для работы со значениями
  • функцию reflect.Copy,
    которая копирует элементы из одного слайса в другой