声明与定义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必须加逗号,否则编译不通过
}
//初始化方式2
b := map[int]string{
1:"mike",
2:"jack",
3:"stvele",
}
//初始化方式3
c := make(map[string]int,10)
c["暑条"] = 10
c["汉堡"] = 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 main
import(
"time"
"math/rand" //随机数包
"time" //时间函数
)
fun main() {
//初始化时间种子
rand.Seed(time.Now().UnixNano())
//初始化map
a := make(map[string]int,1024)
//使用for循环为map添加key与value
for i := 0;i<128;i++ {
key := fmt.Sprintf("stu%d",i) //将i从0到每次自增的值给变量key
value := rand.Intn(1000)//每次循环生成一个小于1000的数
//map赋值操作
a[key] = value
}
//遍历map
for key,value := range a{
fmt.Printf("map[%s]=%d\n",key,value)
}
}
打印结果:map[stu66]=361
map[stu73]=407
map[stu3]=695
map[stu43]=615
map[stu70]=398
map[stu23]=676
…….
上面代码可以看到key与value都是使用rand包来随机生成
删除map指定的key或所有key
package main
import(
"fmt"
)
func main() {
a := make(map[string]int,16)//初始化map
//写入参数
a["stu01"] = 1000
a["stu02"] = 100
a["stu03"] = 10
fmt.Printf("before a=%#v\n",a) //打印删除前map
delete(a,"stu02") //删除stu02
fmt.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使用匿名变量来代替