//map的本质是对散列表的引用
//map中元素的迭代顺序是不固定的
//不同的实现方法会使用不同的散列算法,得到不同的元素顺序
①map的创建与声明。键的类型K必须是可以通过==来进行比较的
ages1 := make(map[string]int)
ages1["vila"] = 22
ages1["anny"] = 21
ages2 := map[string]int{
"tom": 18,
"linc": 24,
}
fmt.Println(ages2)
fmt.Printf("%T,%v\n", ages2, ages2["tom"])
②用delete内置函数删除map中的一个元素
//即使删除的键不在map中,对应的操作也是安全的,并返回值类型的零值
delete(ages2, "linc")
fmt.Println(ages2)
③map元素不是一个变量,不可获取它的地址
//_=&ages2[“tom”],编译错误
④用for循环来遍历map
for name, age := range ages1 {
fmt.Printf("%s\t%d\n", name, age)
}
⑤map类型的零值是nil,即没有引用任何散列表
var ages3 map[string]int
fmt.Println(ages3 == nil)
fmt.Println(len(ages3) == 0)
fmt.Println(ages1["bob"]) //键不在map中,得到map值类型的0值
⑥判断某元素是否存在于map
if age, ok := ages1["bob"]; ok {
fmt.Println(age, ok)
}
⑦map不可比较,只能和nil比较,但可以自己写函数比较
a := func(x, y map[string]int) bool {
//比较map的长度
if len(x) != len(y) {
return false
}
//比较map的键值
for k, xv := range x {
if yv, ok := y[k]; !ok || yv != xv {
return false
}
}
return true
}(ages1, ages2)
fmt.Print("比较map结果:")
fmt.Println(a)
⑧字符串集合
seen := make(map[string]bool)
input := bufio.NewScanner(os.Stdin)
//Scan扫描os.Stdin产生token
for input.Scan() {
line := input.Text() //Text()获取Scan扫描产生的token
if !seen[line] {
seen[line] = true
fmt.Println(line)
}
}
if err := input.Err(); err != nil {
fmt.Fprintf(os.Stderr, "dedup %v\n", err)
os.Exit(1)
}
⑨通过帮助函数使用切片作为map的键
/*var m = make(map[string]int)
func k(list []string) string {
return fmt.Sprintf("%q", list)
}
func Add(list []string) {
m[k(list)]++
}
func Count(list []string) int {
return m[k(list)]
}*/
list := []string{"w"}
Add(list)
z:=Count(list)
m["w"]=10
fmt.Println(m["w"])
fmt.Println(z)