// 声明var a map[string]int// 只声明, 未初始化, 未赋值, map为nil, 不可操作// 初始化
a =make(map[string]int,8)// 容量为8, 不为nil, 为空map, 即map[]// 赋值
a["Tim"]=100
a["Tom"]=99// 简短声明
b :=make(map[string]int,8)// 这里只有一个参数, 与切片要区分// 声明, 初始化, 并赋值
gender :=map[string]int{"Tim":0,"Lily":1,}
嵌套 map
package main
funcmain(){// 需要依次初始化
a :=make(map[string]map[string]int,2)// 这是外层初始化
a["语文"]=make(map[string]int,2)// 这是内层初始化
a["语文"]["上"]=100
a["语文"]["下"]=99
a["数学"]=make(map[string]int,2)// 这是内层初始化
a["数学"]["上"]=100
a["数学"]["下"]=100// 循环遍历外层 mapfor_, v :=range a {
fmt.Println(v)}}
无序遍历
package main
import("fmt""math/rand")funcmain(){
a :=make(map[string]int,5)// 制造一个学号和成绩的对应关系for i :=0; i <5; i++{
k := fmt.Sprintf("stu%02d", i)// 利用 Sprintf 制造学号
v := rand.Intn(100)// 随机一个数字作为成绩
a[k]= v
}// 默认为无序遍历for k,v :=range a {
fmt.Println(k, v)}}
有序遍历
package main
import("fmt""math/rand""sort")funcmain(){
a :=make(map[string]int,5)// 制造一个学号和数字的对应关系for i :=0; i <5; i++{
k := fmt.Sprintf("stu%02d", i)// 利用 Sprintf 制造学号
v := rand.Intn(100)// 随机一个数字作为成绩
a[k]= v
}// 有序遍历: 先将 k 取出, 放入切片先排序, 再按照排序后的切片顺序取出 v// 创建一个切片用于存放 k
keys :=make([]string,0,5)// 这里长度若不为 0,则会补零值(本例中为" "), 并非我们要的效果// map 支持只遍历 kfor k :=range a {
keys =append(keys, k)// 将 k 依次拿出放入切片}// 把切片中的元素排序
sort.Strings(keys)// 最后输出结果for_, v :=range keys {
fmt.Println(v, a[v])}}
删除
package main
import"fmt"funcmain(){
a :=make(map[string]int,2)
a["Tom"]=100
a["Tim"]=80
fmt.Println(a)// map[Tim:80 Tom:100]_, ok := a["Tom"]if ok {// 使用delete(mapName, key), 删除键值对delete(a,"Tom")}
fmt.Println(a)// map[Tim:80]}
判断key是否存在
package main
import"fmt"funcmain(){
a :=map[string]int{"语文":100,"数学":99,}// v, ok := map[key], 重点掌握
v, ok := a["语文"]// 若 ok 为真, v 为对应的值; 若 ok 为假, 则 v 为空值(int 为 0, []int 为 [])if ok {
fmt.Println(v)}else{
fmt.Println("不存在")}}