Функция reflect.DeepEqual
Функция reflect.DeepEqual выполняет глубокое сравнение двух значений произвольных типов. Она возвращает true, если значения глубоко равны, и false в противном случае. Первым параметром функция принимает первое значение для сравнения, вторым параметром — второе значение. В отличие от оператора ==, DeepEqual рекурсивно обходит составные структуры данных, сравнивая их элементы.
Синтаксис
reflect.DeepEqual(a, b)
Пример
Давайте сравним два слайса с одинаковыми элементами:
package 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)
}
Результат выполнения кода:
true
Пример
Давайте сравним две структуры с одинаковыми полями:
package 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)
}
Результат выполнения кода:
true
Пример
Давайте сравним два слайса с разными элементами:
package 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)
}
Результат выполнения кода:
false
Пример
Давайте сравним два среза с разной длиной:
package 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)
}
Результат выполнения кода:
false
Пример
Давайте сравним две карты с одинаковыми парами ключ-значение:
package 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)
}
Результат выполнения кода:
true
Пример
Давайте сравним две вложенные структуры:
package 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)
}
Результат выполнения кода:
true
Пример
Давайте сравним два указателя на одну и ту же переменную:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
p1 := &x
p2 := &x
res := reflect.DeepEqual(p1, p2)
fmt.Println(res)
}
Результат выполнения кода:
true
Пример
Давайте сравним два указателя на разные переменные с одинаковым значением:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
y := 42
p1 := &x
p2 := &y
res := reflect.DeepEqual(p1, p2)
fmt.Println(res)
}
Результат выполнения кода:
false
Смотрите также
-
функцию
reflect.TypeOf,
которая возвращает тип переменной -
функцию
reflect.ValueOf,
которая возвращает значение переменной в видеreflect.Value -
тип
reflect.Value,
предоставляющий методы для работы со значениями -
функцию
reflect.Copy,
которая копирует элементы из одного слайса в другой