Возвращение уникальных предметов в ломтик


Я пытаюсь вернуть уникальные предметы в срез. Я приземлился на следующий, но это кажется довольно оптимальным. Я новичок в golang (это первый проект в нем) и интересно, если есть лучший способ подойти к этому?

// 
// Returns unique items in a slice
//
func Unique(strSlice []string) []string {
    keys := make(map[string]bool)
    list := []string{} 
    for _, entry := range strSlice {
        if _, value := keys[entry]; !value {
            keys[entry] = true
            list = append(list, entry)
        }
    }    
    return list
}


259
2
задан 4 апреля 2018 в 11:04 Источник Поделиться
Комментарии
2 ответа

Это не идиоматические стиль письма в Go, потому что value переменная вводит в заблуждение:


if _, value := keys[entry]; !value {

Первое возвращаемое значение является значением в карте, второе значение указывает на успех или провал в поиске.
Так переименуйте ее в ok или found.

Если кусочек очень большой,
тогда list = append(list, entry) может привести к повторным ассигнований.
В этом случае можно оптимизировать по предварительное определение list на максимальной мощности (len(strSlice)), и назначить элементы по индексу, а не через append.
Но если у вас нет причин для такой оптимизации не надо,
это будет преждевременная оптимизация,
текущее решение-это нормально.

4
ответ дан 6 апреля 2018 в 10:04 Источник Поделиться

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

//
// Returns unique items in a slice
//
func Unique(slice []string) []string {
// create a map with all the values as key
uniqMap := make(map[string]struct{})
for _, v := range slice {
uniqMap[v] = struct{}{}
}

// turn the map keys into a slice
uniqSlice := make([]string, 0, len(uniqMap))
for v := range uniqMap {
uniqSlice = append(uniqSlice, v)
}
return uniqSlice
}

Если ваш не заинтересованы в ценность карте, это обычное для хранения пустой struct{}.

Примечание: эта реализация не будет держать любой заказ входной срез

1
ответ дан 25 апреля 2018 в 09:04 Источник Поделиться