Чтобы немного расширить ответы, которые уже даны:
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
А это карты в двух словах.