Nano Hash - криптовалюты, майнинг, программирование

Как я могу сортировать фрагменты Go, тип элемента которых является псевдонимом строки, но не самой строкой?

type MyObject string
var objects []MyObject

Я хочу отсортировать эти объекты. В стандартной библиотеке есть sort.Strings, но для этого требуется экземпляр []string вместо []MyObject.

Мое текущее решение состоит в том, чтобы реализовать sort.Interface (как показано ниже) и использовать sort.Sort, но я хотел бы избавиться от этого стандартного кода. Есть ли более приятный способ?

type MyObjects []MyObject

func (objs MyObjects) Len() int {
    return len(objs)
}

func (objs MyObjects) Less(i, j int) bool {
    return strings.Compare(string(objs[i]), string(objs[j])) < 0
}

func (objs MyObjects) Swap(i, j int) {
    o := objs[i]
    objs[i] = objs[j]
    objs[j] = o
}
24.08.2015

  • Кстати, в документации для strings.Compare прямо указано, что обычно вы не должны его использовать; просто сделайте return objs[i] < objs[j] (или, если это жалуется, приведите их к string). 24.08.2015
  • Кроме того, идиоматический Swap будет: func (p MyObjects) Swap(i, j int) { p[i], p[j] = p[j], p[i] } 24.08.2015
  • С учетом этих упрощений идиоматический способ сделать это совсем неплох. 24.08.2015
  • Извлеченный урок: мне нужно больше писать на Go, чтобы стать более идиоматичным. 25.08.2015

Ответы:


1

Нет. Поскольку Go не допускает неявного преобразования типов внутри слайсов (также нет ковариантности с интерфейсами), вам необходимо предоставить соответствующие методы для вашего типа.

type MyObjects []MyObject

func (p MyObjects) Len() int           { return len(p) }
func (p MyObjects) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p MyObjects) Less(i, j int) bool { return p[i] < p[j] }

Если вы действительно хотите это сделать, вы можете использовать unsafe (но, пожалуйста, не делайте этого). Я сомневаюсь, что эти 3 дополнительные строки безопасного кода будут иметь для вас большое значение.

http://play.golang.org/p/d6ciFjjr2c

objects := []MyObject{"one", "two", "three", "four"}
sort.Strings(*(*[]string)(unsafe.Pointer(&objects)))
24.08.2015
  • Обозначение p[i], p[j] = p[j], p[i] (спасибо, что напомнили мне об этом :) и компактные тела функций сводят шаблон к минимуму, так что я пойду с этим. 25.08.2015

  • 2

    ЕСЛИ ваш тип MyObject является "псевдонимом" с string базовым типом, вы не можете. См. ответ @JimB здесь.

    Базовый тип MyObject совпадает с базовым типом string (который сам является string), но базовый тип []MyObject не совпадает с базовым типом []string.

    См. дополнительные пояснения здесь:

    Преобразование фрагмента строки в фрагмент произвольного типа

    Почему вы не можете преобразовать типы фрагментов?

    Но если вам случится немного реорганизовать вашу систему типов, ваши проблемы исчезнут:

    type MyObjects []string
    
    var objects MyObjects
    
    func main() {
        objects = MyObjects{"abc", "aaa"}
        sort.Strings(objects)
        fmt.Println(objects)
    }
    

    Результат (попробуйте на Go Playground):

    [aaa abc]
    

    Для удобства вы даже можете указать для него метод Sort(), если хотите:

    func (m MyObjects) Sort() {
        sort.Strings(m)
    }
    

    И используя его:

    objects = MyObjects{"abc", "aaa"}
    objects.Sort()
    fmt.Println(objects)
    

    (Выход тот же.)

    24.08.2015
  • Я понимаю. К сожалению, type MyObjects []string для меня не вариант. К экземплярам MyObject привязана довольно некоторая логика, поэтому мне нужен конкретный тип. 25.08.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..