路漫漫其修远兮
吾将上下而求索

第8章总结:Map

第8章

8.1 
map就是python中的字典

map 是引用类型,可以使用如下声明:
var map1 map[keytype]valuetype
var map1 map[string]int
([keytype] 和 valuetype 之间允许有空格,但是 gofmt 移除了空格)

在声明的时候不需要知道 map 的长度,map 是可以动态增长的。
未初始化的 map 的值是 nil。
value 可以是任意类型的;通过使用空接口类型
通过 key 在 map 中寻找值是很快的,比线性查找快得多,但是仍然比从数组和切片的索引中直接读取要慢 100 倍;
所以如果你很在乎性能的话还是建议用切片来解决问题。

key1 对应的值可以通过赋值符号来设置为 val1:map1[key1] = val1
常用的 len(map1) 方法可以获得 map 中的 pair 数目,这个数目是可以伸缩的
map 可以用 {key1: val1, key2: val2} 的描述方法来初始化,就像数组和结构体一样。
注意 map 不是按照 key 的顺序排列的,也不是按照 value 的序排列的。

map 的初始化:mapCreated := make(map[string]float32)
相当于:mapCreated := map[string]float32{}。

map 可以根据新增的 key-value 对动态的伸缩,因此它不存在固定长度或者最大限制。
也可以选择标明 map 的初始容量 capacity,就像这样:make(map[keytype]valuetype, cap)
当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1

func main() {

	mapLit := map[string]int{"one": 1, "two": 2}
	
	var mapAssigned map[string]int
	mapAssigned = mapLit

	mapAssigned["two"] = 3

	fmt.Printf("Map assigned at \"two\" is: %d\n", mapLit["two"])
}

mapAssigned 也是 mapList 的引用,对 mapAssigned 的修改也会影响到 mapLit 的值

8.2 

val1, isPresent = map1[key1]
isPresent 返回一个 bool 值:如果 key1 存在于 map1,val1 就是 key1 对应的 value 值,并且 isPresent为true;
如果 key1 不存在,val1 就是一个空值,并且 isPresent 会返回 false。
if _, ok := map1[key1]; ok {
	// ...
}
从 map1 中删除 key1:

直接 delete(map1, key1) 就可以。


8.3 
可以使用 for 循环使用 map:
for key, value := range map1 {
	...
}
第一个返回值 key 是 map 中的 key 值,第二个返回值则是该 key 对应的 value 值;这两个都是仅 for 循环内部可见的局部变量。


8.4
假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配 切片中每个 map 元素

func main() {
	// Version A:
	items := make([]map[int]int, 5)
	for i:= range items {
		items[i] = make(map[int]int, 1)
		items[i][1] = 2
	}
	fmt.Printf("Version A: Value of items: %v\n", items)
}

未经允许不得转载:江哥架构师笔记 » 第8章总结:Map

分享到:更多 ()

评论 抢沙发

评论前必须登录!