Существуют ли библиотеки go, которые предоставляют возможности ассоциативных массивов? - PullRequest
13 голосов
/ 19 августа 2010

Я ищу возможность использовать язык go, похожий на «словарь» в python, чтобы облегчить преобразование некоторого кода на python.

РЕДАКТИРОВАТЬ: Карты работали довольно хорошо для этого приложения de-dupe. За несколько секунд мне удалось сжать дублированные элементы 1.3e6 до уникальных элементов 2.5e5, используя карту с 16-байтовым индексом строки. Код, связанный с картой, был прост, поэтому я включил его ниже. Стоит отметить, что предварительное выделение карты с элементами 1.3e6 ускорило ее всего на несколько процентов:

var m = make(map[string]int, 1300000) // map with initial space for 1.3e6 elements

ct, ok := m[ax_hash]
if ok {
    m[ax_hash] = ct + 1
} else {
    m[ax_hash] = 1
}

Ответы [ 3 ]

29 голосов
/ 21 августа 2010

Чтобы немного расширить ответы, которые уже даны:

Go-карта - это типизированная структура данных хэш-карты. Типовая подпись карты имеет вид map[keyType]valueType, где keyType и valueType являются типами ключей и значений соответственно.

Чтобы инициализировать карту, вы должны использовать функцию make:

m := make(map[string]int)

Неинициализированная карта равна nil, и при чтении или записи паника произойдет во время выполнения.

Синтаксис для хранения значений почти такой же, как и для массивов или слайсов:

m["Alice"] = 21
m["Bob"] = 17

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

a := m["Alice"]
b := m["Bob"]

Вы можете использовать ключевое слово range для итерации по карте с циклом for:

for k, v := range m {
    fmt.Println(k, v)
}

Этот код напечатает:

Alice 21
Bob 17

Получение значения для ключа, которого нет на карте, возвращает нулевое значение типа значения:

c := m["Charlie"]
// c == 0

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

a, ok := m["Alice"]
// a == 21, ok == true
c, ok := m["Charlie"]
// c == 0, ok == false

Чтобы удалить запись ключа / значения с карты, вы переворачиваете ее и назначаете false в качестве второго значения:

m["Bob"] = 0, false
b, ok := m["Bob"]
// b == 0, ok == false

Вы можете хранить произвольные типы на карте, используя пустой тип интерфейса interface{}:

n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"

Единственное условие - при получении этих значений вы должны выполнить утверждение типа, чтобы использовать их в исходном виде:

a := n["One"].(int)
b := n["Two"].(string)

Вы можете использовать переключатель типа, чтобы определить типы значений, которые вы извлекаете, и соответственно обработать их:

for k, v := range n {
    switch u := v.(type) {
        case int:
            fmt.Printf("Key %q is an int with the value %v.\n", k, u)
        case string:
            fmt.Printf("Key %q is a string with the value %q.\n", k, u)
    }
}

Внутри каждого из этих case блоков u будет иметь тип, указанный в операторе case; явное утверждение типа не требуется.

Этот код напечатает:

Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".

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

Например, карта o может принимать ключи любого из вышеперечисленных типов:

o := make(map[interface{}]int)
o[1] = 1
o["Two"] = 2

А это карты в двух словах.

9 голосов
/ 19 августа 2010

Тип карты. http://golang.org/doc/effective_go.html#maps

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

dict := make(map[string]string)
dict["user"] = "so_user"
dict["pass"] = "l33t_pass1"
0 голосов
/ 19 августа 2010

Вы, вероятно, ищете карту .

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