定义
引用类型,哈希表,键必须是支持相等运算符类型。值可以是任意类型,没有限制
package main
import "fmt"
func main() {
m := map[int]struct{
name string
age int
}{
1 : {"user1", 10},
2 : {"user2", 20},
}
fmt.Println(m[1].name)
}
常见操作
package main
import "fmt"
func main() {
m := map[string]int{ //判断key是否存在
"a" : 1,
}
if v,ok := m["a"];ok {
println(v, ok) //1 true
}
fmt.Println(m["c"]) //0 对于不存在的key,直接返回\0,不报错
m["b"] = 2 //新增或修改
delete(m, "c") //删除,如果key不存在,不会出错
println(len(m)) //2 获取键值对数量。cap无效
for k, v := range m { //迭代,可仅返回key。随机顺序返回,每次都不相同
println(k, v) //b 2 a 1
}
}
从map中取回的是一个value临时复制品,对其成员的修改是没有意义的
package main
import "fmt"
func main() {
type user struct{ name string }
m := map[int]user{
1 : {"user1"},
}
fmt.Println(m[1].name)
//m[1].name = "Tom" //这样赋值会报错
u := m[1]
u.name = "Tom"
m[1] = u
fmt.Println(m[1].name)
m2 := map[int]*user{
1 : &user{"user1"},
}
m2[1].name = "jack"
fmt.Println(m2[1].name) //返回的是指针复制品,透过指针修改原对象是允许的
}
可以在迭代时安全删除键值,最好不要做新增操作
package main
import "fmt"
func main() {
for i := 0; i < 5;i++ {
m := map[int]string{
0:"a", 1:"a", 2:"a", 3:"a", 4:"a",
5:"a", 6:"a", 7:"a", 8:"a", 9:"a",
}
for k := range m {
m[k+k] = "k"
delete(m, k)
}
fmt.Println(m)
}
}