/
Программирование
/
Курс Golang
/

Сравнение срезов

Golang: Сравнение срезов

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

Задание

Реализуйте функцию AreOrderHistoriesEqual(history1, history2 [][]string) bool, которая проверяет, совпадают ли два списка историй заказов.

Каждая история — это список товаров (срез строк). Истории считаются равными, если количество заказов одинаково и каждый заказ (список товаров) содержит те же товары в том же порядке.

Примеры

history1 := [][]string{
	{"milk", "bread"},
	{"apple", "banana"},
}
history2 := [][]string{
	{"milk", "bread"},
	{"apple", "banana"},
}
AreOrderHistoriesEqual(history1, history2) // true

AreOrderHistoriesEqual(history1, [][]string{
	{"milk", "bread", "butter"},
	{"apple", "banana"},
}) // false
AreOrderHistoriesEqual(nil, [][]string{})  // false

Полезное

  • Пакет slices содержит полезные функции для работы со слайсами

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются