2013-09-01 11 views
15

Как правильно сравнить два массива в Go?Сравнение массивов в языке Go

Например, как я могу сравнить двухмерные массивы с int записей или любых других типов?

Насколько глубоко это сравнение?

+2

Просто для уточнения, так как люди часто делают эту ошибку - вы имеете в виду ломтиков или массивы? В Go есть разница. Если вы не знаете, что вы имеете в виду, можете ли вы вставить примерный код для создания одной из этих вещей, и мы это выясним. – joshlf

+0

@ joshlf13 массивы не ломтики. –

ответ

19

Чтобы сравнить два массива, используйте comparison operators== или !=. Цитата из ссылки:

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

Поскольку массив 2D (или ND) соответствует вышеуказанному требованию, вы можете сравнить его таким же образом.

Вопрос «Насколько глубоко это сравнение?» не имеет смысла для массивов.

+10

Nope slices можно сравнить только с nil; http://play.golang.org/p/Kk8osjPm8n – Tom

+3

@Tom: Где вы видите кусочки? Они никогда не упоминаются в вопросе и в этом ответе. – zzzz

+6

@jnml это правда. Просто многие путаются, потому что в Go [] int {1,2,3} есть срез, но [3] int {1,2,3} - массив. – Tom

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.

+4

спасибо. Есть ли встроенная функция? –

+0

@angry_gopher bytes.Equal() –

12

Для сравнения "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)) 
} 

Возвращает:

истинный
ложные

Проблема заключается в том, что это медленно.

Playground

+1

Существует дополнительная оговорка, согласно которой оба массива должны иметь одинаковый порядок. –

+1

@MaciejSzulik Это не оговорка, это требование. Списки не должны вести себя как наборы. – ereOn

Смежные вопросы