網站首頁 編程語言 正文
Go 語言提供了內置類型 map集合,它將一個值與一個鍵關聯起來,可以使用相應的鍵檢索值。
- map是一種集合,可以像遍歷數組或切片那樣去遍歷它。因為map是由Hash表實現的,所以對map的讀取順序不固定。
- map是無序的,每次打印出來的map都會不一樣,它不能通過index獲取,而必須通過key獲取。
- map的長度是不固定的,和切片一樣可以擴展。
內置的len()函數同樣適用于map,返回map擁有的鍵值對的數量。但是map不能通過cap()函數計算容量(或者說cap()函數的參數不可以是map)。
同一個map中key必須保證唯一。key的數據類型必須是可參與比較運算的類型,也就是支持==或!=操作的類型,如布爾型、整型、浮點型、字符串、數組。切片、函數等引用類型則不能作為key的數據類型。
map的value可以是任何數據類型。map和切片一樣,也是一種引用類型。
1-1 定義
map聲明
- 使用make()函數:變量名 := make(map[key類型]value類型)
- 該聲明方式,如果不初始化map,map也不等于nil。
- 使用var關鍵字定義map:var 變量名 map[key類型] value類型
- 使用var關鍵字聲明map,未初始化的map的默認值是nil。
- nil map不能存放鍵值對。
- 如果要使用map存儲鍵值對,必須在聲明時初始化,或者使用make()函數分配到內存空間。
1-2 map遍歷
map的初始化賦值和遍歷
package main import "fmt" func main() { ?? ?//1、聲明時同時初始化 ?? ?var country = map[string]string{ ?? ??? ?"China": ?"Beijing", ?? ??? ?"Japan": ?"Tokyo", ?? ??? ?"India": ?"New Delhi", ?? ??? ?"France": "Paris", ?? ??? ?"Italy": ?"Rome", ?? ?} ?? ?fmt.Println(country) ?? ?// 短變量聲明初始化方式 ?? ?rating := map[string]float64{"c": 5, "Go": 4.5, "Python": 4.5, "C++": 3} ?? ?fmt.Println(rating) ?? ?//2、創建map后再賦值 ?? ?countryMap := make(map[string]string) ?? ?countryMap["China"] = "Beijing" ?? ?countryMap["Japan"] = "Tokyo" ?? ?countryMap["India"] = "New Delhi" ?? ?countryMap["France"] = "Paris" ?? ?countryMap["Italy"] = "Rome" ?? ?//3、遍歷map(無序) ?? ?//(1)、key 、value都遍歷 ?? ?for k, v := range countryMap { ?? ??? ?fmt.Println("國家", k, "首都", v) ?? ?} ?? ?fmt.Println("-----------") ?? ?//(2)、只展示value ?? ?for _, v := range countryMap { ?? ??? ?fmt.Println("國家", "首都", v) ?? ?} ?? ?fmt.Println("-----------") ?? ?//(3)、只展示key ?? ?for k := range countryMap { ?? ??? ?fmt.Println("國家", k, "首都", countryMap[k]) ?? ?} }
查看元素在集合中是否存在
- 可以通過key獲取map中對應的value值。語法為:map[key]。
- 當key不存在時,會得到該value值類型的默認值,比如string類型得到空字符串,int類型得到0,程序不會報錯。
- 可以通過value, ok := map[key]獲知key/value是否存在。ok是bool型,如果ok是true,則該鍵值對存在,否則不存在。
package main import "fmt" func main() { ?? ?countryMap := make(map[string]string) ?? ?countryMap["China"] = "Beijing" ?? ?countryMap["Japan"] = "Tokyo" ?? ?countryMap["India"] = "New Delhi" ?? ?countryMap["France"] = "Paris" ?? ?countryMap["Italy"] = "Rome" ?? ?//查看元素是否在map中存在 ?? ?value, ok := countryMap["England"] ?? ?fmt.Printf("%q \n", value) ?? ?fmt.Printf("%T , %v \n", ok, ok) ?? ?if ok { ?? ??? ?fmt.Println("首都:", value) ?? ?} else { ?? ??? ?fmt.Println("首都信息未檢索到!") ?? ?} ?? ?//或者 ?? ?if value, ok := countryMap["USA"]; ok { ?? ??? ?fmt.Println("首都:", value) ?? ?} else { ?? ??? ?fmt.Println("首都信息未檢索到!") ?? ?} }
1-3 map集合刪除
delete(map, key) 函數用于刪除集合的某個元素,參數為map和其對應的key。刪除函數不返回任何值。
Go語言沒有為map提供清空所有元素的函數,清空map的唯一辦法是重新make一個新的map。不用擔心垃圾回收的效率,Go語言的垃圾回收比寫一個清空函數更高效。
package main import "fmt" func main() { ?? ?//1、聲明并初始化一個map ?? ?map1 := map[string]string{ ?? ??? ?"element": ? ?"div", ?? ??? ?"width": ? ? ?"100px", ?? ??? ?"height": ? ? "200px", ?? ??? ?"border": ? ? "solid", ?? ??? ?"background": "none", ?? ?} ?? ?//2、根據key刪除map中的某個元素 ?? ?fmt.Println("刪除前:", map1) ?? ?if _, ok := map1["background"]; ok { ?? ??? ?delete(map1, "background") ?? ?} ?? ?fmt.Println("刪除后:", map1) ?? ?//3、清空map ?? ?//map1 = map[string]string{} ?? ?map1 = make(map[string]string) ?? ?fmt.Println("清空后:", map1) }
1-4 map是引用類型
map與切片相似,都是引用類型。將一個map賦值給一個新的變量時,它們指向同一塊內存(底層數據結構)。修改兩個變量的內容都能夠引起它們所指向的數據發生變化。
package main import "fmt" func main() { ?? ?personSalary := map[string]int{ ?? ??? ?"Steven": 18000, ?? ??? ?"Daniel": 5000, ?? ??? ?"Josh": ? 20000, ?? ?} ?? ?fmt.Println("原始薪資:", personSalary) ?? ?newPersonSalary := personSalary ?? ?newPersonSalary["Daniel"] = 8000 ?? ?fmt.Println("修改后newPersonSalary:", newPersonSalary) ?? ?fmt.Println("personSalary受影響情況:", personSalary) }
雖然就底層而言,所有的數據都是由比特組成,但計算機一般操作的是固定大小的數,如整型、浮點型、布爾型、字符串、字符(byte、rune)等。進一步將這些數組織在一起,就可表達更多的對象。
Go語言提供了豐富的數據組織形式,這依賴于Go語言內置的數據類型。這些內置的數據類型,如函數與指針、數組、切片、map等,兼顧了硬件的特性和表達復雜數據結構的便捷性。
原文鏈接:https://blog.csdn.net/weixin_43529465/article/details/129036783
相關推薦
- 2022-05-24 Matplotlib實現各種條形圖繪制_python
- 2022-04-15 SpringBoot系列之MongoDB?Aggregations用法詳解_MongoDB
- 2023-01-23 React新擴展函數setState與lazyLoad及hook介紹_React
- 2022-10-03 C++深入探究重載重寫覆蓋的區別_C 語言
- 2022-10-30 使用AVFoundation實現視頻錄制詳解_IOS
- 2022-07-31 Jenkins定時構建語法規則及時間設置_相關技巧
- 2023-07-03 Python?Thread虛假喚醒概念與防范詳解_python
- 2023-03-29 詳解C++中菱形繼承的原理與解決方法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支