пятница, 28 февраля 2020 г.

Три способа сравнивания срезов (массивов) в Golang

В большинстве случаев вы захотите написать собственный код для сравнения элементов двух срезов.

// Equal проверяет, что a и b содержат одинаковые элементы.
// nil аргумент эквивалентен пустому срезу.
func Equal(a, b []int) bool {
    if len(a) != len(b) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}

Однако для массивов вы можете использовать операторы сравнения == и !=.

a := [2]int{1, 2}
b := [2]int{1, 3}
fmt.Println(a == b) // false

Значения массива сравнимы, если значения типа элемента массива сравнимы. Два значения массива равны, если их соответствующие элементы равны.

Оптимизированный код для байтовых срезов

Чтобы сравнить байтовые срезы, используйте оптимизированные bytes.Equal. Эта функция также обрабатывает nil аргументы как эквивалент пустых срезов.

Универсальный код для рекурсивного сравнения

В целях тестирования вы можете использовать reflect.DeepEqual. Он сравнивает два элемента любого типа рекурсивно.

var a []int = nil
var b []int = make([]int, 0)
fmt.Println(reflect.DeepEqual(a, b)) // false

Производительность этой функции намного хуже, чем для приведенного выше кода, но она полезна в тестовых случаях, где простота и правильность имеют решающее значение.


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий