- 基本使用
package main import ( "fmt" ) func main() { stu := make(map[string]int, 2) stu["xiaoming"] = 25 stu["xiaohua"] = 23 fmt.Println(stu) fmt.Println(stu["xiaoming"]) fmt.Printf("type of a: %T", stu) }
输出:
map[xiaohua:23 xiaoming:25] 25 type of a: map[string]int
- 声明的同时一起初始化
package main import ( "fmt" ) func main() { stu := map[string]int{ "xiaoming": 25, "xiaohua": 22, } fmt.Println(stu) fmt.Println(stu["xiaoming"]) fmt.Println(stu["xiaohua"]) }
输出:
map[xiaohua:22 xiaoming:25] 25 22
- 判断key是否存在
package main import ( "fmt" ) func main() { stu := map[string]int{ "xiaoming": 25, "xiaohua": 22, } v1, result1 := stu["xiaoming"] v2, result2 := stu["xiaohuang"] fmt.Println(result1, v1) fmt.Println(result2, v2) if result1 { fmt.Println("yes") } else { fmt.Println("no") } if result2 { fmt.Println("yes") } else { fmt.Println("no") } }
输出:
true 25 false 0 yes no
如果key存在,则result1为true,否则反之,可见result2。
- 遍历map
package main import ( "fmt" ) func main() { stu := map[string]int{ "xiaoming": 25, "xiaohua": 22, "xiaozhang": 23, "xiaoshi": 21, "xiaoyu": 18, } for k, v := range stu { fmt.Println(k, v) } }
输出:
xiaoming 25 xiaohua 22 xiaozhang 23 xiaoshi 21 xiaoyu 18
也可以只遍历key
for k := range stu { fmt.Println(k) }
- 删除k-v对
使用内置的delete函数进行删除
package main import ( "fmt" ) func main() { stu := map[string]int{ "xiaoming": 25, "xiaohua": 22, "xiaozhang": 23, "xiaoshi": 21, "xiaoyu": 18, } fmt.Println(stu) delete(stu, "xiaoshi") fmt.Println(stu) }
输出:
map[xiaohua:22 xiaoming:25 xiaoshi:21 xiaoyu:18 xiaozhang:23] map[xiaohua:22 xiaoming:25 xiaoyu:18 xiaozhang:23]
- map是无序的,如何让其按照指定的顺序遍历map
「无序的遍历演示」
package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) var hostMap = make(map[string]string, 10) for i := 0; i < 10; i++ { key := fmt.Sprintf("host%02d", i) value := rand.Intn(100) ip := fmt.Sprintf("10.1.1.%d", value) hostMap[key] = ip } for k, v := range hostMap { fmt.Println(k, v) } }
输出:
host03 10.1.1.32 host00 10.1.1.0 host02 10.1.1.37 host05 10.1.1.97 host06 10.1.1.61 host07 10.1.1.62 host08 10.1.1.28 host09 10.1.1.40 host01 10.1.1.62 host04 10.1.1.70
注意到了吗?map是无序的。虽然host01-host09是有顺序的赋给了map,但遍历取值的时候就不是有序了。而且,每一次遍历的顺序都不同。
「实现有序的遍历」
package main import ( "fmt" "math/rand" "sort" "time" ) func main() { rand.Seed(time.Now().UnixNano()) var hostMap = make(map[string]string, 10) for i := 0; i < 10; i++ { key := fmt.Sprintf("host%02d", i) value := rand.Intn(100) ip := fmt.Sprintf("10.1.1.%d", value) hostMap[key] = ip } var hostSlice = make([]string, 0, 200) // 将hostMap中的key追加到hostSlice(切片) for k := range hostMap { hostSlice = append(hostSlice, k) } // 使用内置的sort函数对切片(hostSlice)进行排序(基于key进行排序,刚刚已经把key追加到了切片中) sort.Strings(hostSlice) for _, k := range hostSlice { fmt.Println(k, hostMap[k]) } }
输出:
host00 10.1.1.87 host01 10.1.1.98 host02 10.1.1.93 host03 10.1.1.4 host04 10.1.1.1 host05 10.1.1.28 host06 10.1.1.11 host07 10.1.1.43 host08 10.1.1.31 host09 10.1.1.83
- map作为元素存储到切片中
package main import ( "fmt" ) func main() { // 创建一个存储map类型元素的切片,最大扩张容量为3 dataSlice := make([]map[string]string, 3) fmt.Println(dataSlice) fmt.Println("------------") // 在切片的索引0位置创建一个key和value都为string类型的map,容量为2 dataSlice[0] = make(map[string]string, 2) // 给切片的索引0位置,赋map类型的数据,key为user,value为root dataSlice[0]["user"] = "root" dataSlice[0]["pwd"] = "abc123" fmt.Println(dataSlice) fmt.Println("------------") for i := range dataSlice { fmt.Println(dataSlice[i]) } fmt.Println("------------") for i := range dataSlice { fmt.Println(dataSlice[i]["user"], dataSlice[i]["pwd"]) } }
输出:
[map[] map[] map[]] ------------ [map[pwd:abc123 user:root] map[] map[]] ------------ map[pwd:abc123 user:root] map[] map[] ------------ root abc123
上面例子,只在切片的索引0位置存储了map元素,索引1和2没有。
- 切片作为map的value,map的key为字符串
package main import "fmt" func main() { // 声明字符串类型的切片和初始化了两个值 value := []string{"192.168.10.12", "10.1.1.23"} //声明key类型为字符串,value类型为切片的map,并初始化了一对key和value data := map[string][]string{ "ip": value, } fmt.Println(data) fmt.Println(data["ip"]) }
输出:
map[ip:[192.168.10.12 10.1.1.23]] [192.168.10.12 10.1.1.23]
- map作为map的value
package main import "fmt" func main() { value := map[string]string{ "管理IP": "10.1.2.39", "业务IP": "192.168.12.56", } a := map[string]map[string]string{ "nginx": value, } fmt.Println(a) fmt.Println(a["nginx"]) fmt.Println(a["nginx"]["管理IP"]) fmt.Println(a["nginx"]["业务IP"]) }
输出:
map[nginx:map[业务IP:192.168.12.56 管理IP:10.1.2.39]] map[业务IP:192.168.12.56 管理IP:10.1.2.39] 10.1.2.39 192.168.12.56