Как Go выполняет сравнение без встроенного сопоставимого интерфейса? - PullRequest
0 голосов
/ 15 января 2020

Я нашел этот вопрос, когда исследовал топи c - Как называется сопоставимый интерфейс в golang? , однако он не полностью отвечает на мой вопрос.

Допустим, у меня есть простой тип Специальный :

type Special struct {
    Value int
    IsActive bool
    Guid string
}

Теперь я хочу использовать свой пользовательский тип со структурой данных «Двоичное дерево» стороннего производителя. Я предполагаю, что в реализацию двоичного дерева будет включен интерфейс, который мне нужно реализовать, чтобы использовать его с моим пользовательским типом:

type Comparable interface{
    CompareTo(other Comparable) int
}

Это хорошо, но что происходит, когда мне нужно использовать другое структура данных, например 'Sorted Linked List'? Я загружаю другой пакет, который имеет другой интерфейс для реализации:

type Comparable2 interface{
    Compare(other Comparable) int
}

Другими словами, мне нужно добавлять разные приемные функции (методы) к моему типу каждый раз, когда мне нужно использовать структуру данных, которая должна знаете, как сравнить мой тип? Это немного странно, на мой взгляд. Я что-то упустил или как эти случаи обрабатываются при разработке программного обеспечения с Go?

1 Ответ

3 голосов
/ 15 января 2020

Как 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, который принимает в качестве аргумента произвольную функцию сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...