Go语言中的字典
字典就是存储键值对映射关系的集合,在Go语言中,需要在声明时指定键和值的类型,此外Go语言中的字典是个无序集合,底层不会按照元素添加顺序维护元素的存储顺序。
如下所示,Go语言中字典的简单示例:
func DictExample() {
var tempMap map[string]int
tempMap = map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
k := "two"
v, ok := tempMap[k]
// ok,如果key存在,则ok为true,否则ok为false
if ok {
fmt.Printf("the element of key %q:%d", k, v)
} else {
fmt.Println("Not found!")
}
}
1 字典声明
字典的声明基本上没有多余的元素,例如:
var tempMap map[string]int
// tempMap:声明的字典变量名
// string:字典键的类型
// int:字典值的类型
2 字典初始化
Go语言中,可以先声明再初始化变量,也可以通过 :=
将字典的声明和初始化合并为一条语句:
testMap := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
打印字典testMap,发现其并没有按照存储的顺序进行打印,这是因为Go语言中字典是个无序集合。
在Go语言中,字典的初始化通常要和初始化在一起进行,如果分开了出现编译的报错,如下所示:
var tempMap map[string]int
tempMap["one"] = 1
如果需要初始化一个空的字典,需要使用Go语言内置的 make() 函数:
var tempMap = make(map[string]int)
tempMap["one"] = 1
还可以通过 make() 函数的第二个参数选择是否在创建的时候指定该字典的初始化存储容量(超出会自动扩容):
testMap = make(map[string]int, 100)
3 元素赋值
字典的赋值指定键值对即可,如下所示:
testMap["one"] = 1
注:字典初始化之后才能进行赋值操作,如果仅仅是声明,此时字典的值为 nil, 在nil 上进行操作,编译时会报panic,导致编译不通过。
4 查找元素
Go语言中,通过如下的代码查找特定的键值对:
value, ok := testMap["one"]
if ok {
// 字典中存储键"one"对应的值
}
// 如上代码,value是真正返回的键值,ok是是否在字典中找到key对应值的标识,这是一个布尔值,如果查找成功,返回true,否则返回false
5 删除元素
Go语言中,使用delete() 用于删除容器内的元素,也能够用来删除字典元素,如下所示:
delete(testMap,"one")
执行删除时,如果“one”不存在或者字典尚未进行初始化,也不会产生报错。
6 遍历元素
Go语言中,可以像遍历数组一样对字典进行遍历,如下所示:
testMap := map[string]int{
"one":1,
"two":2,
"three":3
}
for key,value := range testMap {
fmt.Println(key, value)
}
也可以使用匿名变量,只获取字典的值:
for _,value := range testMap {
fmt.Println( value)
}
或者只获取字典的键:
for key := range testMap {
fmt.Println(key)
}
7 键值对调
testMap := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
newMap := make(map[int]string)
for k, v := range testMap {
newMap[v] = k
}
for k, v := range newMap {
fmt.Println(k, v)
}
8 字典排序
Go语言中的字典是个无序集合,如果想要对字典进行排序,可以通过分别为字典的键或值创建切片,然后通过对切片进行排序实现。
按照键进行排序:
testMap := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
// 创建切片
keys := make([]string, 0)
for key := range testMap {
keys = append(keys, key)
}
// 切片排序
sort.Strings(keys)
for _, v := range keys {
fmt.Println(v, testMap[v])
}
按照值进行排序:
testMap := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
// 创建切片
values := make([]int, 0)
for _, value := range testMap {
values = append(values, value)
}
// 对字典的值进行排序
sort.Ints(values)
for _, v := range values {
fmt.Println(v)
}