Golang通脉之map概略

百科 · 2026-09-13 03:08:18

Go言语中供给的通脉映拍照干容器为map ,其内部独霸散列表(hash)完成。概略

map 是通脉一种无序的键值对的集结 。map 最次要的概略一点是经由过程 key 来疾速检索数据,key 近似于索引 ,通脉指向数据的概略值 map 是一种集结,所以可以像迭代数组和切片那样迭代它。通脉不过,概略map 是通脉无序的 ,没法决意它的概略前去按序,这是通脉因为 map 是独霸 hash 表来完成的,Go言语中的概略map是援引圭表类型 ,必须初始化才调独霸 。通脉

独霸map过程中需求寄看的概略几点 :

  • map是无序的 ,每次打印出来的通脉map都邑不一样,它不克不及经由过程index掉落踪掉落踪,而必须经由过程key掉落踪掉落踪
  • map的长度是不结实的 ,也就是和slice一样,也是一种援引圭表类型
  • 内置的len函数一样合用于map ,前去map具有的key的数量
  • map的key可所以全数可斗劲的圭表类型  ,如布尔型  、整数型 、浮点型  、宏壮型、字符串型……也可以键。

1、定义

Go言语中 map的定义语法以下 :

map[KeyType]ValueType

个中

  • KeyType:展示键的圭表类型。
  • ValueType:展示键对应的值的圭表类型 。

**map圭表类型的变量默许初始值为nil ,需求独霸make()函数来分拨内存 (声明并初始化) **  。

语法为 :

make(map[KeyType]ValueType, [cap])

个中cap展示map的容量 ,该参数当然不是必须的 ,可是我们理应在初始化map的时辰就为其指定一个契合的容量。

可独霸内建函数 make ,也可独霸 map 关头字来定义 Map:

/* 声明变量,默许 map 是 nil */var mapVariable map[KeyType]ValueType /* 独霸 make 函数 */mapVariable = make(map[keyType]ValueType)rating := map[string]float32 { "C":5, "Go":4.5, "Python":4.5, "C++":2 }

假定不初始化 map ,那么就会成立一个 nil map。nil map 不克不及用来存放键值对

2 、根本独霸

map中的数据都是成对展示的  :

func main() {  scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["小明"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["小明"]) fmt.Printf("type of a:%T\n", scoreMap)}

输进 :

map[小明:100 张三:90]
100
type of a:map[string]int

map也支撑在声明的时辰加添元素,比如:

func main() {  userInfo := map[string]string{   "username": "张三",  "password": "123456", } fmt.Println(userInfo) //}

3、剖断键可否存在

Go言语中有个剖断map中键可否存在的出格写法,格式以下:

value, ok := map[key]func main() {  /* 成立集结 */   countryCapitalMap := make(map[string]string)      /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" // 假定key存在ok为true,v为对应的值;不存在ok为false,v为值圭表类型的零值 v, ok := countryCapitalMap["United States"] if ok {   fmt.Println("Capital of United States is", captial)     }else {       fmt.Println("Capital of United States is not present")    }}

4、map的遍历

Go言语中独霸for range遍历map 。

func main() {  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对	,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" for k, v := range countryCapitalMap {   fmt.Println(k, v) }}

只想遍历key的时辰 ,可以按上面的写法:

func main() {  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" for k := range countryCapitalMap {   fmt.Println(k) }}

寄看:遍历map时的元素按序与添加键值对的按序有关。

5、delete()函数删除map元素

独霸delete()内建函数从map中删除一组键值对,删除函数不前去任何值,delete()函数的格式以下:

delete(map, key)

个中,

  • map:展示要删除键值对的map
  • key:展示要删除的键值对的键
func main(){  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" delete(countryCapitalMap, "France")//将"France":"Paris"从map中删除 for k,v := range scoreMap{   fmt.Println(k, v) }}

6、指定按序遍历map

func main() {  rand.Seed(time.Now().UnixNano()) //初始化随机数种子  var scoreMap = make(map[string]int, 200)  for i := 0; i < 100; i++ {   key := fmt.Sprintf("stu%02d", i) //生成stu开首的字符串  value := rand.Intn(100)          //生成0~99的随机整数  scoreMap[key] = value } //掏出map中的全数key存进切片keys var keys = make([]string, 0, 200) for key := range scoreMap {   keys = append(keys, key) } //对切片举办排序 sort.Strings(keys) //屈就排序后的key遍历map for _, key := range keys {   fmt.Println(key, scoreMap[key]) }}

7、map圭表类型的切片

上面的代码切片中的元素为map圭表类型时的独霸:

func main() {  var mapSlice = make([]map[string]string, 3) for index, value := range mapSlice {   fmt.Printf("index:%d value:%v\n", index, value) } fmt.Println("after init") // 对切片中的map元素举办初始化 mapSlice[0] = make(map[string]string, 10) mapSlice[0]["username"] = "张三" mapSlice[0]["password"] = "123456" mapSlice[0]["address"] = "深圳" for index, value := range mapSlice {   fmt.Printf("index:%d value:%v\n", index, value) }}

8、value为切片圭表类型的map

上面的代码演示了map中值为切片圭表类型的独霸 :

func main() {  var sliceMap = make(map[string][]string, 3) fmt.Println(sliceMap) fmt.Println("after init") key := "中国" value, ok := sliceMap[key] if !ok {   value = make([]string, 0, 2) } value = append(value, "北京", "上海") sliceMap[key] = value fmt.Println(sliceMap)}

9 、map是援引圭表类型

与切片近似,map是援引圭表类型 。当将map分拨给一个新变量时 ,它们都指向不异的内部数据筹划 。是以,一个的改削会回响此外一个 :

func main() {       personSalary := map[string]int{         "steve": 12000,        "jamie": 15000,    }    personSalary["mike"] = 9000    fmt.Println("Original person salary", personSalary)    newPersonSalary := personSalary    newPersonSalary["mike"] = 18000    fmt.Println("Person salary changed", personSalary) }

运转下场 :

Original person salary map[steve:12000 jamie:15000 mike:9000] 
Person salary changed map[steve:12000 jamie:15000 mike:18000]

map不克不及独霸独霸符举办斗劲  。只能用来搜检map可否为空  。不然会报错 :invalid operation: map1 == map2 (map can only be comparedto nil)

到此这篇关于Golang通脉之map概略的文章就引见到这了,更多相干Go言语 map内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!

文章推荐:

《回廊亭》片子立项 改编自东野圭吾小说《回廊亭杀人义务》

让非遗更“活” 法治宣传更“火” !梅州开展系列接地气有温度显特色的普法活动

省财政厅 、省应急厅向惠州、梅州 、河源等受灾地区拨付救灾资金5000万元

同心守本色 久久铸荣光 !梅州市社会组织开展跨行业退役军人职工国防教育共建活动

分类残剩桶的益处有哪些?

8月3日至11日,汕梅高速公路往汕头方向丰顺互通至揭阳互通路段封闭施工

梅州市职业技术学校荣获2026年广东省中职思政课教师教学能力比赛一等奖

全市唯一、全省行业唯一!梅州公积金晋级第二届广东省政务服务技能大赛决赛

《电锯惊魂9》甚么时辰上映 《电锯惊魂9》演员表剧情简介

今日17时起填报  !梅州2026年第四批市内中职、中技学校(全日制)征集志愿补录计划表公布

市八届人大七次会议召开 何晓军当选市八届人大常委会主任 姜正宏当选梅州市监察委员会主任  侯向磊当选梅州市中级人民法院院长

以武为脉 以影为桥 共绘客都文旅新图景!梅州香港武术影视交流考察活动顺利举办

热门浏览

标签列表