Go语言map(Go语言映射)
map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable 等。
map 概念
map 是引用类型,可以使用如下方式声明:var mapname map[keytype]valuetype
其中:
mapname 为 map 的变量名。
keytype 为键类型。
valuetype 是键对应的值类型。
在声明的时候不需要知道 map 的长度,因为 map 是可以动态增长的,未初始化的 map 的值是 nil,使用函数 len() 可以获取 map 中 pair 的数目。提示:[keytype] 和 valuetype 之间允许有空格。
【示例】
package main
import "fmt"
func main() {
var mapLit map[string]int
//var mapCreated map[string]float32
var mapAssigned map[string]int
mapLit = map[string]int{"one": 1, "two": 2}
mapCreated := make(map[string]float32)
mapAssigned = mapLit
mapCreated["key1"] = 4.5
mapCreated["key2"] = 3.14159
mapAssigned["two"] = 3
fmt.Printf("Map literal at \"one\" is: %d\n", mapLit["one"])
fmt.Printf("Map created at \"key2\" is: %f\n", mapCreated["key2"])
fmt.Printf("Map assigned at \"two\" is: %d\n", mapLit["two"])
fmt.Printf("Map literal at \"ten\" is: %d\n", mapLit["ten"])
}
输出结果:
Map literal at "one" is: 1
Map created at "key2" is: 3.14159
Map assigned at "two" is: 3
Map literal at "ten" is: 0
示例中 mapLit 演示了使用{key1: value1, key2: value2}的格式来初始化 map ,就像数组和结构体一样。上面代码中的 mapCreated 的创建方式
mapCreated := make(map[string]float)等价于mapCreated := map[string]float{} 。mapAssigned 是 mapList 的引用,对 mapAssigned 的修改也会影响到 mapLit 的值。
注意:可以使用 make(),但不能使用 new() 来构造 map,如果错误的使用 new() 分配了一个引用对象,会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址:
mapCreated := new(map[string]float)
接下来当我们调用mapCreated["key1"] = 4.5的时候,编译器会报错:invalid operation: mapCreated["key1"] (index of type *map[string]float).
map 容量
和数组不同,map 可以根据新增的 key-value 动态的伸缩,因此它不存在固定长度或者限制,但是也可以选择标明 map 的初始容量 capacity,格式如下:make(map[keytype]valuetype, cap)
例如:
map2 := make(map[string]float, 100)
当 map 增长到容量上限的时候,如果再增加新的 key-value,map 的大小会自动加 1,所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。这里有一个 map 的具体例子,即将音阶和对应的音频映射起来:
noteFrequency := map[string]float32 {
"C0": 16.35, "D0": 18.35, "E0": 20.60, "F0": 21.83,
"G0": 24.50, "A0": 27.50, "B0": 30.87, "A4": 440}
用切片作为 map 的值
既然一个 key 只能对应一个 value,而 value 又是一个原始类型,那么如果一个 key 要对应多个值怎么办?例如,当我们要处理 unix 机器上的所有进程,以父进程(pid 为整形)作为 key,所有的子进程(以所有子进程的 pid 组成的切片)作为 value。通过将 value 定义为 []int 类型或者其他类型的切片,就可以优雅的解决这个问题,示例代码如下所示:
mp1 := make(map[int][]int)
mp2 := make(map[int]*[]int)
- 随机文章
- 动态背景马尔代夫(神秘背景下的浪漫国度——马尔代夫!)
- 提醒 马尔代夫 马累(马尔代夫首都马累传出新冠确诊病例,游客需重视防护)
- 中国马尔代夫鲍鱼(中国游客再次成马尔代夫鲍鱼消费主力)
- 海底 马尔代夫(马尔代夫海底探秘)
- 马尔代夫迪拜航班(重启的马尔代夫-迪拜直航,敬请期待!)
- 马尔代夫高级图片(仙境般的马尔代夫——高清图片欣赏)
- 威海马尔代夫新闻(威海旅行社推出马尔代夫岛屿游新套餐)
- 万豪 金卡 马尔代夫(万豪金卡会员在马尔代夫尽享奢华体验)
- 杭州马尔代夫打卡(探秘杭州“马尔代夫”,你值得一去!)
- 广东 马尔代夫(广东游客最爱的旅游胜地:马尔代夫)
- 火箭 马尔代夫(火箭成功将卫星送往马尔代夫轨道)
- 斐济对比马尔代夫(斐济与马尔代夫:你应该选择哪一个?)
- 订购马尔代夫机票(预订马尔代夫航班,享受海岛度假之旅)
- 泉州马尔代夫地址(泉州去马尔代夫旅游的地址及攻略推荐)
- 东台 马尔代夫(东台市民游马尔代夫:海上明珠之旅)
- 徐州马尔代夫水上(徐州打造水上天堂,一睹马尔代夫风情)
- 夏天 马尔代夫(炎热夏季的理想之地:马尔代夫)
- 马尔代夫下雨几天(马尔代夫连续降雨数日,旅游业受影响)
- 马尔代夫假水测评(马尔代夫:揭秘度假村的真实海水质量)
- 暑假 马尔代夫(重返马尔代夫,享受美轮美奂的暑假奢华体验)
- 马尔代夫出圈照片(马尔代夫旅拍再创新高,网友赞不绝口)
- 马尔代夫出国口语(马尔代夫旅行英语必备:常用口语攻略)
- 马尔代夫单程机票(马尔代夫单程机票:留下来或者永别了)
- 马尔代夫优美简介(了解马尔代夫,探寻印度洋的天堂之美)
- 资阳 马尔代夫(资阳新人游马尔代夫,探访度假胜地海底世界)
- 马尔代夫台风效果(马尔代夫受台风袭击,旅游业遭受损失)
- 马尔代夫与海平面(马尔代夫岛国紧急应对海平面上升威胁)
- 诺库 马尔代夫(重写后的标题:诺库度假村:探索马尔代夫的完美退役地)
- 环球地图马尔代夫(全球地图:马尔代夫的位置和地理信息)
- 马尔代夫和中国钱(马尔代夫将从中国获得重要的援助款项)
