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 содержит полезные функции для работы со слайсами
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 содержит полезные функции для работы со слайсами
Ваше упражнение проверяется по этим тестам
// Тесты
package solution
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestAreOrderHistoriesEqual(t *testing.T) {
tests := []struct {
name string
h1 [][]string
h2 [][]string
expected bool
}{
{
name: "Equal histories",
h1: [][]string{
{"milk", "bread"},
{"apple", "banana"},
},
h2: [][]string{
{"milk", "bread"},
{"apple", "banana"},
},
expected: true,
},
{
name: "Different orders",
h1: [][]string{
{"milk", "bread"},
{"apple", "banana"},
},
h2: [][]string{
{"milk", "bread", "butter"},
{"apple", "banana"},
},
expected: false,
},
{
name: "Different sequence",
h1: [][]string{
{"milk", "bread"},
{"apple", "banana"},
},
h2: [][]string{
{"apple", "banana"},
{"milk", "bread"},
},
expected: false,
},
{
name: "Nil vs empty",
h1: nil,
h2: [][]string{},
expected: false,
},
{
name: "Both empty",
h1: [][]string{},
h2: [][]string{},
expected: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := AreOrderHistoriesEqual(tt.h1, tt.h2)
assert.Equal(t, tt.expected, result)
})
}
}Решение учителя откроется через:
20:00
