1.定义
map是一种集合,可以像遍历数组或切片那样去遍历它。因为map是由Hash表实现的,所以对map的读取顺序不固定。
1.1 注意事项
- map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取。
map
的长度是不固定的,和切片一样可以扩展。内置的len()函数同样适用于map,返回map拥有的键值对的数量。
- 同一个
map
中key
必须保证唯一。
key
的数据类型必须是可参与比较运算的类型,也就是支持==或!=操作的类型。
- 引用类型则不能作为key的数据类型。
- map的value可以是任何数据类型。
- map和切片一样,也是一种引用类型。
2. 声明语法
可以使用var
关键字来定义map,也可以使用内建函数make()
。
使用var关键字声明map,未初始化的map的默认值是nil,不能存放键值对。如果要使用map存储键值对,必须在声明时初始化,或者使用make()函数分配到内存空间。
2.1 声明初始化
package main import "fmt" func main() { var ageMap = map[string]int { "张三": 20, "李四": 23, "王五": 33, } fmt.Printf("变量ageMap--> 值: %v 类型: %T \n",ageMap,ageMap)
ageMap2 := map[string]int{"张三": 20, "李四": 23, "王五": 33,} fmt.Printf("变量ageMap2--> 值: %v 类型: %T",ageMap2,ageMap2) }
|
2.2 使用make
package main import "fmt" func main() { ageMap := make(map[string]int) ageMap["张三"] = 20 ageMap["李四"] = 23 ageMap["王五"] = 23 fmt.Printf("变量ageMap-- 值: %v 类型: %T",ageMap,ageMap) }
|
3.遍历Map
3.1 遍历基础map
package main import "fmt" func main() { ageMap := map[string]int{"张三": 20, "李四": 23, "王五": 33,} for k, v := range ageMap { fmt.Printf("k-> 值: %v v--> %v \n",k,v) } }
|
3.2 遍历嵌套map
package main
import "fmt"
func main() { productMap := map[string]map[string]float32{ "水果": {"香蕉": 3.22, "苹果": 1.88, "葡萄": 2.49}, "家具": {"桌子": 66.00, "凳子": 12.00, "沙发": 999.00}, "手机": {"小米10": 3813.00, "华为P40": 5781.00, "iphone12": 7823.00}, } for class, product := range productMap { for name, price := range product { fmt.Printf("分类: %s 产品:%s 价格: %0.2f \n",class,name,price) } } }
|
4.操作map
4.1 判断key是否存在
通过value, ok := map[key]获知key/value是否存在
。ok是bool型,如果ok是true,则该键值对存在,否则不存在。
package main import "fmt" func main() { fruitMap := map[string]float32{"香蕉": 3.22, "苹果": 1.88, "葡萄": 2.49}
price,ok := fruitMap["香蕉"] if ok { fmt.Printf("香蕉存在!价格: %.2f \n",price) } price2,ok2 := fruitMap["樱桃"] if ok2 { fmt.Printf("樱桃存在!价格: %.2f \n",price2) } else { fmt.Printf("樱桃不存在! \n") } if price,ok := fruitMap["苹果"];ok { fmt.Printf("苹果存在!价格: %.2f \n",price) } }
|
4.2 删除
delete(map, key)
函数用于删除集合的某个元素,参数为map
和其对应的key
。删除函数不返回任何值。
package main import "fmt" func main() { fruitMap := map[string]float32{"香蕉": 3.22, "苹果": 1.88, "葡萄": 2.49,"梨":4.13} fmt.Printf("删除前-->fruitMap = %v \n",fruitMap) delete(fruitMap,"苹果") fmt.Printf("删除后-->fruitMap = %v \n",fruitMap) fruitMap = map[string]float32{} fmt.Printf("清空后-->fruitMap = %v \n",fruitMap) }
|
5.map是引用类型
map与切片相似,都是引用类型。将一个map赋值给一个新的变量时,它们指向同一块内存(底层数据结构)。因此,修改两个变量的内容都能够引起它们所指向的数据发生变化。
package main import "fmt" func main() { fruitMap := map[string]float32{"香蕉": 3.22, "苹果": 1.88, "葡萄": 2.49,"梨":4.13} fmt.Printf("调用函数前-->fruitMap = %v \n",fruitMap) testMap(fruitMap) fmt.Printf("调用函数后-->fruitMap = %v \n",fruitMap) }
func testMap(fruitMap map[string]float32){ fruitMap["香蕉"] = 5.99 }
|