Основы Go

Теория: Сравнение срезов

Срезы (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

Рекомендуемые программы