【Go语言基础】Go语言中的map集合详细使用(附带源码)

Go语言中的map集合

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等,兼顾了硬件的特性和表达复杂数据结构的便捷性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值