Проверка равенства двух срезов


Как я могу проверить, если два ломтика равны?

5 180

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")
    }
}