–
第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) }
–
评论前必须登录!
注册