Сравнение массивов на языке Go
Как правильно сравнить два массива в Go?
Например, как я могу сравнить двухмерные массивы с именами int или любыми другими типами?
Насколько глубоко это сравнение?
Ответы
Ответ 1
Для сравнения двух массивов используйте операторы сравнения ==
или !=
. Цитата из ссылки:
Значения массива сравнимы, если значения типа элемента массива сопоставимы. Два значения массива равны, если их соответствующие элементы равны.
Поскольку массив 2D (или ND) соответствует вышеуказанному требованию, вы можете сравнить его таким же образом.
Вопрос "Насколько глубоко это сравнение?" не имеет смысла для массивов.
Ответ 2
Для сравнения "Deep" вы можете использовать reflect.DeepEqual
.
DeepEqual тесты для глубокого равенства. Он использует нормальное == равенство, где это возможно, но сканирует элементы массивов, срезов, карт и полей структур. В картах ключи сравниваются с ==, но элементы используют глубокое равенство. DeepEqual правильно обрабатывает рекурсивные типы. Функции равны, только если они равны нулю. Пустой срез не равен нильскому фрагменту.
Пример:
package main
import (
"bytes"
"fmt"
"reflect"
)
func main() {
a := []byte{} // empty slice
b := []byte(nil) // nil slice
fmt.Printf("%t\n%t", bytes.Equal(a, b), reflect.DeepEqual(a, b))
}
Возврат:
верно
ложь
Предостережение заключается в том, что он медленный.
Игровая площадка
Ответ 3
Если у вас есть 2 int
срезов/массивов, попробуйте это:
func IntArrayEquals(a []int, b []int) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
ПРИМЕЧАНИЕ: это для 1D массивов, но вы можете переписать его для 2D.