Срезы (slices
) в Go нельзя сравнивать напрямую с помощью операторов ==
или !=
. Компилятор не позволит выполнить сравнение двух срезов, даже если они имеют одинаковую длину и значения.
a := []int{1, 2, 3}
b := []int{1, 2, 3}
fmt.Println(a == b) // ошибка компиляции
Как сравнивать срезы
Для сравнения содержимого срезов используется пакет slices
из стандартной библиотеки, который содержит функцию slices.Equal()
.
import "slices"
a := []int{1, 2, 3}
b := []int{1, 2, 3}
fmt.Println(slices.Equal(a, b)) // => true
Сравнение на равенство ссылок
Если необходимо проверить, ссылаются ли два среза на один и тот же массив в памяти, можно сравнить &a[0]
и &b[0]
при условии, что оба среза непустые. Это используется редко.
a := []int{1, 2, 3}
b := a
fmt.Println(&a[0] == &b[0]) // => true
Проверка на nil
Срезы можно сравнивать с nil
. Срез, объявленный без инициализации, равен nil
.
var s []int
fmt.Println(s == nil) // => true
empty := []int{}
// пустой, но не nil
fmt.Println(empty == nil) // => false