声明与定义var a map[key的类型]value类型
var a map[string]int //key为string类型,值为int类型var b map[int]string //key为int类型,值为string类型var c map[float32]string //key为float32类型,值为string类型
map类型是一个Key-value的数据结构(类似php里的关联数组)
map和切片一样是引用类型,必须在声明时赋值,或使用make()函数进行初始化
map必须初始化才能使用,否则panic
初始化
//初始化方式一var a map[string]int = map[string]int{"小明":99,"小红":100,//最后一个key必须加逗号,否则编译不通过}//初始化方式2b := map[int]string{1:"mike",2:"jack",3:"stvele",}//初始化方式3c := make(map[string]int,10)c["暑条"] = 10c["汉堡"] = 9
判断当前map是否存在指定的key
a := map[string]int{"小东":88,"小英":99,}b := "小明"//判断小明是否存在于变量a的map中c,ok :=a[b]if ok != true {fmt.Printf("key %s is not exist",b)}else {fmt.Printf("key %s is %d\n",b,c)}
上面代码的判断就如下图所示,变量c就如同是a[b]的值,ok获取的就是key:小明
所以11行代码判断出小明不存在于map中
遍历map方法:
package mainimport("time""math/rand" //随机数包"time" //时间函数)fun main() {//初始化时间种子rand.Seed(time.Now().UnixNano())//初始化mapa := make(map[string]int,1024)//使用for循环为map添加key与valuefor i := 0;i<128;i++ {key := fmt.Sprintf("stu%d",i) //将i从0到每次自增的值给变量keyvalue := rand.Intn(1000)//每次循环生成一个小于1000的数//map赋值操作a[key] = value}//遍历mapfor key,value := range a{fmt.Printf("map[%s]=%d\n",key,value)}}
打印结果:map[stu66]=361map[stu73]=407map[stu3]=695map[stu43]=615map[stu70]=398map[stu23]=676
…….
上面代码可以看到key与value都是使用rand包来随机生成
删除map指定的key或所有key
package mainimport("fmt")func main() {a := make(map[string]int,16)//初始化map//写入参数a["stu01"] = 1000a["stu02"] = 100a["stu03"] = 10fmt.Printf("before a=%#v\n",a) //打印删除前mapdelete(a,"stu02") //删除stu02fmt.Printf("after a=%#v\n",a) //打印删除后map//甚至使用for range方法遍历删除for key,_ := range a {delte(a,key)}fmt.Printf("the for range delete a=%#v\n",a)}
上面代码中的for range方法中,删除map元素只会查找key。所以value使用匿名变量来代替
