Как Go обрабатывает сравнение без встроенного сопоставимого интерфейса?
Это не так. Это зависит от вас, чтобы реализовать сравнение для пользовательских типов, где это необходимо. Распространенным шаблоном, таким как тот, который находится в пакете time , является метод Equal()
для вашего типа, который принимает другой экземпляр того же типа в качестве аргумента для сравнения.
Итак для вашего примера типа:
type Special struct {
Value int
IsActive bool
Guid string
}
Это будет выглядеть так:
func (s Special) Equal(u Special) bool {
return s.Value == u.Value &&
s.IsActive == u.IsActive &&
s.Guid == u.Guid
}
Хотя имейте в виду, в этом конкретном c примере две структуры этого типа напрямую сопоставимы в любом случае, поскольку все базовые типы напрямую сопоставимы. См. этот ответ для получения более подробной информации.
Можно по-прежнему выбирать прямое сравнение каждого поля (как я продемонстрировал), если ощущается, что оно добавляет ясности или что структура может вырасти до включите несопоставимые поля в будущем.
Если вы заинтересованы в сравнении с целью упорядочения, это совсем другое дело (и языки, которые притворяются, что они не являются, на мой взгляд, принципиально сломаны) .
Если ваш тип может быть последовательно упорядочен, вы можете реализовать интерфейс sort.Interface
. Если у вас есть тип, который можно упорядочить по-разному, вы можете вместо этого использовать sh метод sort.Slice
, который принимает в качестве аргумента произвольную функцию сравнения.