Go教程映射
Posted 玖五二七
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go教程映射相关的知识,希望对你有一定的参考价值。
映射是通过键值访问的一个集合.一个映射通过键来访问它存储的值.键是一个简单的从映射中找出值的方式.就像是书前面的索引一样.键可以看作是值的索引
相对于数组和切片只能用整数作为索引不同,映射可以作用任何可以使用==操作符的类型作为键,如数字,字符串等等,所有的键类型必须相同,所有的值也必须是同一类型.但是键和值不必是相同的类型.比如键是字符串,值是浮点数
声明映射的代码如下
var 变量名 map[key_type]value_type
这里的var 和map都是go中的保留关键字.
// 先声明后创建
var map0 map[string]int
map0 = make(map[string]int) // 创建后才能使用
fmt.Printf("map0 %#v \\n", map0)
// 给映射赋值
map0["1"] = 1 // "1": 1
map0["hello"] = 2 // "hello": 2
映射字面量初始化
和切片与数组一样,映射也可以使用字面量来初始化,也是用来进行初始化
// 映射字面量
map2 := map[string]int"1": 1, "2": 2
fmt.Printf("map2 %#v \\n", map2)
// map2 map[string]int"1":1, "2":2
映射中的零值
与数组和切片一样,对于没有赋值过的键,会得到一个零值.
// 映射的零值
fmt.Printf("map2[3] = %d", map2["3"]) // 0
映射的零值取决于不同的类型,可能不是0,比如字符串就是空字符.
// 字符串零值
map3 := make(map[string]string)
fmt.Printf("map3[h] = %s\\n", map3["h"]) // 输出为空字符串
映射声明的nil值
// 先声明后创建
var map0 map[string]int
//panic: assignment to entry in nil map
// map0["1"] = 1
map0 = make(map[string]int) // 必须先make才能赋值
map0["1"] = 1
如何区分已赋值还是原始零值
零值虽然有用,但是会产生一个问题,就是不知道这个值是原始0值还是被赋值的.试想一下有个映射里面保存每个同学的成绩,张三得了0分,那么,这个0分是真正的0分还是因为忘了录入造成的就不得而知了.
为了解决这个问题,获取映射键的时候可以选择取出第2个布尔类型的变量的值.这个值如果是true,表示该键已经赋过值了,如果是false,则表示还没有被赋值.
// 字符串零值
map3 := make(map[string]string)
v, ok := map3["h"]
fmt.Printf("map3[h] = %s %#v\\n", v, ok)
// map3[h] = false
使用for…range来循环映射
与数组和切片一样,映射也支持for…range的循环来获取每一个键和值,代码如下所示
// for... range循环
for k, v := range map2
fmt.Println("k = ", k, " v = ", v)
以上就是使用for range循环的代码
但是运行这段代码会发生一个现象,就是输出不是顺序的.这是正常的,因为映射在内存中的存储是无序的,和数组与切片的索引一定是有顺序的不同,映射是随机的.
如何顺序打印随机的映射
方法是对key先切片排序.然后按该切片进行打印输出
import (
"fmt"
"sort"
)
func main()
// 映射字面量
map2 := map[string]int"1": 1, "2": 2, "3":3
order := []string
for k := range map2
order = append(order, k)
sort.Strings(order)
// for... range循环
for _, v := range order
fmt.Println("k = ", v, " v = ", map2[v])
经过修改以后,代码每次输出顺序都一致了
用delete删除键
golang提供了delete函数来删除映射中的键
// 字符串零值
map3 := make(map[string]string)
v, ok := map3["h"]
fmt.Printf("map3[h] = %s %#v\\n", v, ok) // ok = false
map3["h"] = "5"
v, ok = map3["h"]
fmt.Printf("map3[h] = %s %#v\\n", v, ok) // ok = true
delete(map3, "h")
fmt.Printf("map3[h] = %s %#v\\n", v, ok) // ok = false,因为h被删除了
以上是关于Go教程映射的主要内容,如果未能解决你的问题,请参考以下文章