понедельник, 1 июня 2020 г.

Метод reflect.DeepEqual для сравнивания двух объектов

func DeepEqual (x, y interface {}) bool

DeepEqual сообщает, являются ли x и y "глубоко равными", определяется следующим образом. Два значения одинакового типа глубоко равны, если применяется один из следующих случаев. Значения различных типов никогда не бывают глубоко равными.

Значения массива глубоко равны, когда их соответствующие элементы глубоко равны.

Значения структур глубоко равны, если их соответствующие поля, как экспортированные, так и не экспортированные, глубоко совпадают.

Значения func глубоко равны, если оба равны nil; в противном случае они не глубоко равны.

Значения интерфейса глубоко равны, если они содержат глубоко равные конкретные значения.

Значения карты (map) глубоко равны, когда все из следующих условий являются истинными: они оба равны nil или оба не равны nil, имеют одинаковую длину и либо являются одним и тем же объектом карты, либо их соответствующие ключи (соответствующие с помощью равенства Go) отображаются глубоко равные значения.

Значения указателя глубоко равны, если они равны с помощью оператора Go == или если они указывают на глубоко равные значения.

Значения среза глубоко равны, когда все следующие условия верны: они оба равны nil или оба не равны nil, имеют одинаковую длину и либо указывают на одну и ту же начальную запись одного и того же базового массива (то есть &x[0] == &y[0]) или соответствующие им элементы (вплоть до длины) глубоко равны. Обратите внимание, что ненулевой пустой срез и нулевой срез (например, []byte{} и []byte(nil)) не являются глубоко равными.

Другие значения - числа, bool, строки и каналы - глубоко равны, если они равны с помощью оператора Go ==.

Вообще DeepEqual - это рекурсивная релаксация оператора Go ==. Однако эту идею невозможно реализовать без некоторой несогласованности. В частности, возможно, что значение может быть неравным самому себе, либо потому, что оно имеет тип func (в общем случае несопоставимый), либо потому, что оно является значением NaN с плавающей запятой (не равным себе при сравнении с плавающей запятой), либо потому, что это массив, структура или интерфейс, содержащий такое значение. С другой стороны, значения указателя всегда равны себе, даже если они указывают или содержат такие проблемные значения, потому что они сравниваются равными с помощью оператора Go ==, и это достаточное условие, чтобы быть глубоко равным, независимо от содержимого. DeepEqual был определен таким образом, чтобы тот же ярлык применялся к срезам и картам: если x и y - это один и тот же срез или одна и та же карта, они глубоко равны независимо от содержимого.

Когда DeepEqual обходит значения данных, он может найти цикл. Во второй и последующие разы, когда DeepEqual сравнивает два значения указателя, которые сравнивались ранее, он обрабатывает значения как равные, а не проверяет значения, на которые они указывают. Это гарантирует, что DeepEqual завершается.


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


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

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