一、概述
映射(Map)是方便而强大的内建数据结构,它可以关联不同类型的值。其键可以是任何相等性操作符支持的类型, 如整数、浮点数、复数、字符串、指针、接口(只要其动态类型支持相等性判断)、结构以及数组。 切片不能用作映射键,因为它们的相等性还未定义。与切片一样,映射也是引用类型。 若将映射传入函数中,并更改了该映射的内容,则此修改对调用者同样可见。
二、练习
代码如下
package main
import (
"fmt"
)
/*
1. 引用类型,哈希表
2. 键必须是支持相等预算符(== 、 !=)类型,eg: number, string, pointer, array, struct 以及对应的interface
3. 值可以是任意类型,没有限制
*/
type person struct {
name string
age int
}
func main() {
//创建map
m := map[int]person{
1: {"Ryan.Xu", 26},
2: {"Huanchao.Xu", 28},
}
// fmt.Println(m[1].name)
fmt.Printf("m‘s value is %v \n", m)
//遍历map 元素
for key, val := range m {
fmt.Printf("key is %d, value is %v \n", key, val)
}
//判断key:1 是否存在,存在则打印其value
if v, ok := m[1]; ok {
fmt.Println(v)
}
//对于不存在的key,直接返回\0, 不会报错
fmt.Println(m[3])
//新增map 元素
m[3] = person{
"国庆",
26,
}
fmt.Printf("m’s value is %v, m[3]'s value is %v \n", m, m[3])
//删除map 元素
delete(m, 3)
fmt.Printf("m’s value is %v, m[3]'s value is %v \n", m, m[3])
//获取map 元素个数
fmt.Printf("m's length is %d \n", len(m))
//修改map中的value
modifyValue()
fmt.Println("\nmodifyValue2: ")
modifyValue2()
fmt.Printf("\nCreate Map by make: \n")
createByMake()
}
type student struct {
stuNo string
stuName string
stuSex int
}
func modifyValue() {
stuMap := map[string]student{
"10001": {"10001", "stuOne", 1},
"10002": {"10002", "stuTwo", 0},
"10003": {"10003", "stuThree", 1},
}
//Error: cannot assign to struct field userMap["10002"].stuName
//userMap["10002"].stuName = "stu_Two"
stuTemp := stuMap["10002"]
stuTemp.stuName = "stu_Two"
stuMap["10002"] = stuTemp
for k, v := range stuMap {
fmt.Printf("key is %s, value is %v \n", k, v)
}
}
//通过指针的形式来修改
func modifyValue2() {
stuMap := map[string]*student{
"10001": {"10001", "stuOne", 1},
"10002": {"10002", "stuTwo", 0},
"10003": {"10003", "stuThree", 1},
}
stuMap["10003"].stuName = "stu_Three"
for k, v := range stuMap {
fmt.Printf("key is %s, value is %v \n", k, v)
}
}
func createByMake() {
countryCapitalMap := make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap["France"] = "Paris"
countryCapitalMap["Italy"] = "罗马"
countryCapitalMap["Japan"] = "东京"
countryCapitalMap["India "] = "新德里"
for country, capital := range countryCapitalMap {
fmt.Printf(country+"'s capital is %s \n", capital)
}
// for country := range countryCapitalMap {
// fmt.Printf(country+"'s capital is %s \n", countryCapitalMap[country])
// }
captial, ok := countryCapitalMap["美国"] //如果确定是真实的,则存在,否则不存在
if ok {
fmt.Println("美国的首都是", captial)
} else {
fmt.Println("没有查询到美国的首都")
}
}