Go Map — изучайте язык Go

Go
Go Map — изучайте язык Go

предисловие

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, см. больше замечательных статей.

Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!

公众号二维码