Я пытаюсь сравнить 2 структуры типа массива в Golang, чтобы узнать, равна ли структура 1, полученная из веб-скраппинга, структуре 2, которая представляет собой данные, извлеченные из базы данных. Я думал, что это способ узнать, произошли ли изменения между внешней сетью и моей базой данных.
Структуры:
type Exchange struct {
Name string `gorm:"Column:name" json:"name"`
Buy float64 `gorm:"Column:buy" json:"buy"`
Sell float64 `gorm:"Column:sell" json:"sell"`
}
Результат после консультации от слома:
&[{Dólar 38.5 41 } {Euro 38.82 43.57 } {P. Argentino 0.05 0.35 } {Real 6.95 8.95 }]
Из Интернета
&[{Dólar 38.5 41} {Euro 38.82 43.57} {P. Argentino 0.05 0.35} {Real 6.95 8.95}]
Мой код:
fmt.Println(exchanges)
dbExchanges := getExchangesFromDB()
fmt.Println(dbExchanges)
if exchanges == dbExchanges {
fmt.Println("is equal")
} else {
fmt.Println("no is equal")
}
fmt.Println("Struct equal: ", reflect.DeepEqual(exchanges, dbExchanges))
Результат: нет равно
Структура равна: false
Спасибо @icio, мне нужно сравнить обе стойки для возврата, если они равны или нет.
Я не могу понять, почему они не одинаковы
Сравнивать структуры в Go просто. Похоже, вы сравниваете указатели с фрагментами структур, что не так.
Я проголосовал за то, чтобы закрыть ответ, потому что это «опечатка», хотя она и преувеличивает значение опечатки, но я думаю, что этот вопрос не имеет большого значения для будущих пользователей stackoverflow. Значения являются указателями на слайсы, а не на слайсы. Указатели сравниваются равными только тогда, когда они указывают на одно и то же значение. Решение состоит в том, чтобы ваш код (который не включен в вопрос) использовал срезы, а не указатели на срезы, или для сравнения для сравнения *exchanges
и *dbExchanges
.
Во-первых, если вы сравниваете адрес памяти двух переменных вместо их значений. Во втором предложении if (с использованием Reflect.DeepEqual) вы сравниваете их значения.
Можете ли вы пояснить, что не так с вашим кодом и как бы вы хотели, чтобы он вел себя по-другому? Два примера, которыми вы поделились, не совпадают, и результат вашего кода говорит, что они не совпадают. Я неправильно понял? Создание примера на go.dev/play может быть полезным. Спасибо