Проверка равенства двух срезов
Как я могу проверить, если два ломтика равны?
5 ответов:
вам нужно перебрать каждый из элементов в срезе и проверить. Равенство для срезов не определено. Однако, есть
вы должны использовать отразить.DeepEqual ()
DeepEqual-рекурсивная релаксация оператора Go==.
DeepEqual сообщает, являются ли x и y "глубоко равными", определяемыми как следует. Два значения одинакового типа глубоко равны, если одно из применяются следующие случаи. Значения различных типов никогда не бывают глубоко равный.
значения массива глубоко равны, когда их соответствующие элементы очень равны.
значения структуры глубоко равны, если их соответствующие поля, оба экспортируется и не экспортируется, глубоко равны.
значения Func глубоко равны, если оба равны нулю; в противном случае они не являются очень равны.
значения интерфейса глубоко равны, если они содержат глубоко равный бетон ценности.
Значения карты глубоко равны, если они являются одним и тем же объектом карты или если они имеют одинаковую длину и соответствующие им ключи (сопоставляются с помощью Go равенство) карта глубоко равных ценностей.
значения указателя глубоко равны, если они равны с помощью Go's == оператор или, если они указывают на глубоко равные значения.
значения среза глубоко равны, когда все следующие значения истинны: они оба нулевые или оба не равны нулю, они имеют одинаковую длину, и они указывают на одну и ту же начальную запись одного и того же базового массива (то есть, &x[0] == &y[0]) или их соответствующие элементы (до длина) глубоко равный. Обратите внимание, что ненулевой пустой срез и ноль срез(например, []byte{} и []byte (nil)) не являются глубоко равными.
другие значения-числа, bools, строки и каналы-глубоко равны, если они равны с помощью оператора Go==.
Это просто пример использования отразить.DeepEqual () это дано в ответе @VictorDeryagin.
package main import ( "fmt" "reflect" ) func main() { a := []int {4,5,6} b := []int {4,5,6} c := []int {4,5,6,7} fmt.Println(reflect.DeepEqual(a, b)) fmt.Println(reflect.DeepEqual(a, c)) }
результат:
true false
Если у вас есть два
[]byte
, сравниваем их с помощью байт.Равный. В документации Golang говорится:Equal возвращает логическое сообщение о том, имеют ли a и b одинаковую длину и содержат одинаковые байты. Аргумент nil эквивалентен пустому срезу.
использование:
package main import ( "fmt" "bytes" ) func main() { a := []byte {1,2,3} b := []byte {1,2,3} c := []byte {1,2,2} fmt.Println(bytes.Equal(a, b)) fmt.Println(bytes.Equal(a, c)) }
выводит
true false
и вы все еще можете использовать Sprintf
package main import "fmt" type color string func (color) String() string { return "black" } func main() { slice1 := []color{color("red"), color("green")} slice2 := []color{color("blue"), color("yellow")} if fmt.Sprintf("%v", slice1) == fmt.Sprintf("%v", slice2) { println("not really") } }