2015-10-19 3 views
0

Я хочу создать массив, содержащий уникальные строки. Как я могу это сделать?Как создать массив, содержащий уникальные строки?

var paths = make([]string, 0) 

func main() { 
    // Members are added dynamically 
    paths = append(paths, "aaa") 
    paths = append(paths, "bbb") 
    paths = append(paths, "bbb") 
    paths = append(paths, "ccc") 

    // convert ["aaa", "bbb", "bbb", "ccc"] -> ["aaa", "bbb", "ccc"] 
    // or can I use some class that disallow the same string automaticaly? 
} 

ответ

5

Если вы хотите собрать уникальные элементы, то есть тип данных Set. Go не имеет заданного типа данных, но вы можете использовать map[string]bool, чтобы действовать как набор.

Таким образом, вместо кусочка добавлять элементы к map[string]bool как ключ с true в качестве значения:

m := make(map[string]bool) 

m["aaa"] = true 
m["bbb"] = true 
m["bbb"] = true 
m["ccc"] = true 

Чтобы проверить, если элемент уже в сборе (карте), вы можете просто использовать index expression:

exists := m["somevalue"] 

Это эксплуатирует zero value, то есть, если карта еще не содержит элемент, значение типа значения возвращается ноль, который false в случае bool, правильно указывая, что элемент не находится в коллекции.

Элементы на карте не имеют фиксированного порядка. Если вам нужно сохранить заказ (например, порядок вставки), используйте фрагмент (чтобы запомнить порядок) и карту (чтобы указать, является ли добавляемый элемент новым). Это проще всего с помощью помощника add() Функция:

var m = make(map[string]bool) 
var a = []string{} 

func main() { 
    add("aaa") 
    add("bbb") 
    add("bbb") 
    add("ccc") 
} 

func add(s string) { 
    if m[s] { 
     return // Already in the map 
    } 
    a = append(a, s) 
    m[s] = true 
} 
+1

icza, спасибо за ваш ответ и проверку грамматики! Хм, я вижу, я понял, что мне нужно лечить Set data type самостоятельно в Go. Исходный код пуст. Это было легко понять. Большое спасибо. –

Смежные вопросы