Сравнение структур

В Go структуры можно сравнивать с помощью операторов == и !=. Оператор == возвращает true, если все соответствующие поля двух структур равны, и false в противном случае. Оператор != работает противоположным образом. Сравнивать можно только структуры одинакового типа. Важно, что сравнение возможно только если все поля структуры являются сравниваемыми типами (такими как числа, строки, булевы значения, указатели, каналы и интерфейсы).

Синтаксис

gostruct1 == struct2
struct1 != struct2

Пример

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

gopackage main

import "fmt"

type Person struct {
  name string
  age  int
}

func main() {
  p1 := Person{name: "John", age: 30}
  p2 := Person{name: "John", age: 30}
  res := p1 == p2
  fmt.Println(res)
}

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

gotrue

Пример

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

gopackage main

import "fmt"

type Person struct {
  name string
  age  int
}

func main() {
  p1 := Person{name: "John", age: 30}
  p2 := Person{name: "Jane", age: 25}
  res := p1 == p2
  fmt.Println(res)
}

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

gofalse

Пример

Структуры с несравниваемыми полями (например, слайсами) нельзя сравнивать с помощью ==:

gopackage main

type Data struct {
  numbers []int
}

func main() {
  d1 := Data{numbers: []int{1, 2, 3}}
  d2 := Data{numbers: []int{1, 2, 3}}
  // Ошибка компиляции: слайсы нельзя сравнивать
  res := d1 == d2
  _ = res
}

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

go"cannot compare d1 == d2 (struct containing []int cannot be compared)"

Пример

Для сравнения структур с несравниваемыми полями можно использовать пакет reflect:

gopackage main

import (
  "fmt"
  "reflect"
)

type Data struct {
  numbers []int
}

func main() {
  d1 := Data{numbers: []int{1, 2, 3}}
  d2 := Data{numbers: []int{1, 2, 3}}
  res := reflect.DeepEqual(d1, d2)
  fmt.Println(res)
}

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

gotrue

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

  • описание структур,
    основы работы с составными типами данных
  • доступ к полям структуры,
    чтение и запись значений полей
  • методы структур,
    привязка функций к типам
  • встраивание структур,
    композиция и переиспользование кода