предисловие
Hash
Таблица — это оригинальная и практичная структура данных, неупорядоченнаяkey/value
Набор пар, где всеkey
Они разные, даютсяkey
допустимыйпостоянная временная сложностьдля получения, обновления или удаления соответствующего значения.Map
По сути, это ссылка на хэш-таблицу, из которой можно быстро получить данные на основе ключа, который является своего рода индексом, указывающим на значение, связанное с ключом. У меня будет возможность рассказать вам позжеMap
Нижний слой, научите всех, как использоватьMap
В этом смысл этого раздела, помните одну вещь:Map
Хранит неупорядоченный набор пар ключ-значение.
Создать и инициализировать
использоватьmake
функция
make
Можно создавать срезы, а также использовать их для созданияMap
. Правила таковы:
m := make(map[keyType]valueType)
Попробуем создать:
month := make(map[string]int)
month["January"] = 1
month["February"] = 2
month["March"] = 3
Первая строка кода создаетkey
Типstring
,value
Типint
НулевойMap
month
, тогда дайmonth
Назначаются три пары ключ-значение.
Использовать литерал
Приведенный выше код может быть реализован буквально:
month := map[string]int{"January":1,"February":2,"March":3}
// 还可以写成这样
month := map[string]int{
"January":1,
"February":2,
"March":3,
}
Вы также можете создавать пустые пространства, используя литералыMap
, без присвоения значений внутри фигурных скобок:
month := map[string]int{}
fmt.Println(month) // 输出:map[]
доступныйMap
, естьnil
Map
? Есть конечноnil
изMap
:
var month map[string]int
fmt.Println(month == nil) // 输出:true
заnil
изmap
Вы не можете получить доступ к парам ключ-значение, иначе будет сообщено об ошибкеpanic: assignment to entry in nil map
. можно использовать указанныйmake
функция, чтобы инициализировать ее:
var month map[string]int
month = make(map[string]int)
month["January"] = 1
fmt.Println(month) // 输出:map[January:1]
Естественно, вы можете думать об этом,Map
Нулевое значениеnil
,Map
нижний слойHash
ссылка на таблицу.Map
изkey
возможновстроенный тип,так же может бытьтип структуры, пока вы можете использовать==
оператор сравнения, можно использовать какkey
.кусочек,функцияа такжеТип структуры, содержащий срез, эти типы нельзя использовать в качестве эталонной семантикиkey
, использование этих типов вызовет ошибки компиляции:
month := map[[]string]int{}
// 编译错误:invalid map key type []string
заMap
изvalue
Например, нет ограничений по типам, и, конечно же, нет причин запрещать пользователям использовать слайсы в качествеMap
Значение:
m := map[string][]int{}
slice := []int{1,2,3}
m["slice"] = slice
fmt.Println(m["slice"])
// 或者
slice := []int{1,2,3}
m := map[string][]int{"slice":slice}
fmt.Println(m["slice"])
Первый кусок кода созданkey
Типstring
, значениеslice
тип нуляMap
, затем нарезатьslice
присвоено имяslice
изkey
. Второй абзац кода является сокращенной версией первого абзаца кода.
как пользоватьсяMap
Map
Использование очень простое, аналогично массиву, массив использует индекс,Map
использоватьkey
получить или изменитьvalue
.
m := map[string]int{}
m["January"] = 1 // 赋值
fmt.Println(m) // 输出:map[January:1]
m["January"] = 10 //修改
fmt.Println(m) // 输出:map[January:10]
january := m["January"] // 获取value
fmt.Println(january) // 输出:10
При выполнении операции модификации, еслиkey
уже существует, новое значение перезапишет старое значение, приведенный выше код был отражен, поэтомуkey
Это не разрешено повторять.
Получение несуществующегоkey
изvalue
В это время будет возвращено нулевое значение, соответствующее типу значения.В это время мы не знаем, существует ли пара ключ-значение со значением ноль или пара ключ-значение не существует вообще. К счастью,Map
дает нам метод:
february,exists := m["February"]
fmt.Println(february,exists) // 输出:0 false
При получении значения есть еще одно возвращаемое значение.Первое возвращаемое значениеvalue
, второе возвращаемое значениеboolean
переменная типа, представляющаяvalue
он существует. Это дает нам суждениеkey
Будь там обеспечивает большое удобство.
delete
-- удалить пару ключ-значение
в отличиеSlice
,Go
Предоставляет нам возможность удалять пары ключ-значение --delete
функция.
Прототип функции:
func delete(m map[Type]Type1, key Type)
Map
, второй параметрkey
.
m := map[string]int{
"January":1,
"February":2,
"March":3,
}
fmt.Println(m) // 输出:map[March:3 January:1 February:2]
delete(m,"January")
fmt.Println(m) // 输出:map[February:2 March:3]
При удалении несуществующей пары ключ-значениеdelete
Функция не сообщает об ошибке и не действует.
траверсMap
Map
Не можете использоватьfor
Можно использовать обход цикла, как массивы и срезы.range
траверс.
for key, value := range m {
fmt.Println(key, "=>", value)
}
February => 2
March => 3
January => 1
оператор пробела_
игнорировать возвращенныйkey
илиvalue
. Когда неоднократно выполняющий код, вы обнаружите, что возвращаемое значение порядка, вероятно, не то же самое, то естьMap
Обход не упорядочен.
len
функция
можно использоватьlen
Функция возвращает количество пар ключ-значение на карте:
fmt.Println("len(m) =",len(m))
Map
является ссылочным типом
Map
является ссылкой на базовые данные.编写代码的过程中,会涉及到Map
Скопируйте, передача между функциямиMap
Ждать. иSlice
похожий,Map
Указание на базовые данные не происходитcopy
из.
m := map[string]int{
"January":1,
"February":2,
"March":3,
}
month := m
delete(month,"February")
fmt.Println(m)
fmt.Println(month)
map[January:1 March:3]
map[January:1 March:3]
Приведенный выше код будетMap
m
назначить вmonth
, удаленоmonth
пара ключ-значение в ,m
также изменился, заявивMap
При копировании,m
иmonth
Он должен поделиться основными данными. Если данные одной стороны изменены, другая сторона также изменится соответственно. Точно так же прохождение между функциямиMap
на самом деле трансмиссияMap
ссылка, не будет включать копию базовых данных, если они будут изменены в вызываемой функцииMap
, что также воспринимается в вызывающей функцииMap
Перемена.
Тогда, если я действительно хочу скопироватьMap
что делать?
month := map[string]int{}
m := map[string]int{
"January":1,
"February":2,
"March":3,
}
for key,value := range m{
month[key] = value
}
delete(month,"February")
fmt.Println(m)
fmt.Println(month)
map[January:1 February:2 March:3]
map[January:1 March:3]
В приведенном выше коде мы используемrange
будетm
Цикл пары ключ-значение назначаетсяmonth
, затем удалитеmonth
Одну из пар ключ-значение можно увидеть из распечатанного результата,m
Без изменений. Это позволяет получить истинную копию.
оMap
Это использование этого, добро пожаловать в комментарии и обмен!
(Конец полного текста)
Оригинал статьи, если нужно перепечатать, указывайте источник!
Добро пожаловать, чтобы отсканировать код и подписаться на официальный аккаунт »Голанг здесь” или двигатьсяseekload.net, см. больше замечательных статей.
Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!