Go- map 的使用
发布于: 1 小时前
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
判断键值对是否存在
删除键值对
使用 for range 遍历
map 类型的切片
map 排序
map 键值对调
代码示例可以直接运行
package main
import (
"fmt"
"sort"
)
func printDivider(str ...string) {
fmt.Println()
fmt.Println("-----------------------------------------------")
if len(str) > 0 {
fmt.Println(str)
}
}
func main() {
/*
判断键值对是否存在
*/
printDivider("判断键值对是否存在")
m1 := map[string]int{"a": 1, "b": 2, "c": 3}
v, ok := m1["a"] // 如果取值存在,则返回对应的值,和true
fmt.Printf("m1[\"a\"] = %d, %t\n", v, ok) // 输出:m1["a"] = 1, true
v, ok = m1["w"] // 如果取值不存在,则返回对应类型的零值,和false
fmt.Printf("m1[\"w\"] = %d, %t\n", v, ok) // 输出:m1["w"] = 0, false
/*
删除键值对
*/
printDivider("删除键值对")
fmt.Println(m1) // 输出:map[a:1 b:2 c:3]
delete(m1, "a")
fmt.Println(m1) // 输出:map[b:2 c:3]
delete(m1, "w") // 如果key不存在,不会产生错误
fmt.Println(m1) // 输出:map[b:2 c:3]
/*
使用for range遍历
*/
printDivider("使用for range遍历")
for k, v := range m1 {
fmt.Printf("%s-%d ", k, v) // 输出:b-2 c-3
}
fmt.Println()
/*
map类型的切片
切片是一个数组,切片的下标是整型,切片的元素是map
*/
printDivider("map类型的切片")
s1 := make([]map[int]int, 5) // 初始化一个切片,元素类型为map[int][int],长度为5
fmt.Printf("len(s1) = %d, cap(s1) = %d\n", len(s1), cap(s1)) // 输出:len(s1) = 5, cap(s1) = 5
/* 正确的赋值方式 */
for i := range s1 {
s1[i] = make(map[int]int, 1)
s1[i][1] = 0
}
fmt.Println(s1) // 输出:[map[1:0] map[1:0] map[1:0] map[1:0] map[1:0]]
s2 := make([]map[int]int, 5)
/* 错误的赋值方式,因为s只是切片中的元素的一个拷贝,对s进行赋值,并不会影响切片中的值 */
for _, s := range s2 {
s = make(map[int]int, 1)
s[1] = 0
}
fmt.Println(s2) // 输出:[map[] map[] map[] map[] map[]]
/*
map排序
1、首先将map的key保存在切片中
2、对切片进行排序
3、根据排序后的切片遍历map
*/
printDivider("map排序")
map1 := map[string]int{"w": 1, "b": 9, "a": 2, "m": 4, "n": 88}
keys := make([]string, len(map1))
i := 0
for k, _ := range map1 {
keys[i] = k
i++
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf("%s:%d ", k, map1[k]) // 输出:a:2 b:9 m:4 n:88 w:1
}
fmt.Println()
/*
map键值对调
成功对调的前提是value值可以作为key,并且value不重复
*/
printDivider("map键值对调")
fmt.Println(map1) // 输出:map[a:2 b:9 m:4 n:88 w:1]
map2 := make(map[int]string, len(map1))
for k, v := range map1 {
map2[v] = k
}
fmt.Println(map2) // 输出:map[1:w 2:a 4:m 9:b 88:n]
}
复制代码
划线
评论
复制
发布于: 1 小时前阅读数: 3
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/c0067d627937e6e9e66478bfe】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论