时光驯服一切,我与往事之间,像回声,再怎么千回百转,终究消失在山谷。 by 七堇年
引用于:http://wufazhuce.com/one/1373
map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key,对应的 value 可以迅速定位。
map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable 等。
基础知识
- map 是引用类型。
- 未初始化的 map 的值是 nil。
- 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。
- value 可以是任意类型的;通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言。
- map 传递给函数的代价很小:在 32 位机器上占 4 个字节,64 位机器上占 8 个字节,无论实际上存储了多少数据。通过 key 在 map 中寻找值是很快的,比线性查找快得多,但是仍然比从数组和切片的索引中直接读取要慢 100 倍;所以如果你很在乎性能的话还是建议用切片来解决问题。
- 声明格式:
var map1 map[keytype]valuetype
。 - 初始化格式:
make(map[keytype]valuetype)
。 - 另一种初始化格式:
map[keytype]valuetype{key:value}
,类似数组、结构体初始化方式。 - 不要使用 new,永远用 make 来构造 map。
- 常用的 len(map1) 方法可以获得 map 中的 pair 数目,这个数目是可以伸缩的,因为 map-pairs 在运行时可以动态添加和删除。
- map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序
- 如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序(使用 sort 包),然后可以使用切片的 for-range 方法打印出所有的 key 和 value。
- map 类型是非线程安全的.当并行访问一个共享的 map 类型的数据,map 数据将会出错。
示例
func Test_demo1(t *testing.T) {
temp_map := map[string]int{"a": 1, "b": 2, "c": 3}
//如果map中不存在key1,val1就是一个值类型的空值。
fmt.Println(temp_map["d"]) //0
//判断key是否存在
val, ok := temp_map["d"]
fmt.Println(ok) //false
fmt.Println(val) //0
val, ok = temp_map["c"]
fmt.Println(ok) //true
fmt.Println(val) //3
//与if混合使用
if _, ok = temp_map["a"]; ok {
fmt.Println(temp_map["a"]) //1
}
//删除key
delete(temp_map, "a")
fmt.Println(temp_map) //map[b:2 c:3]
//配合for...range使用
for key, val := range temp_map {
fmt.Printf("map[%s]=%d ", key, val) //map[b]=2 map[c]=3
}
}
map 类型的切片
func Test_demo2(t *testing.T) {
temp_slice := make([]map[string]int, 3)
for i := range temp_slice {
temp_slice[i] = make(map[string]int)
temp_slice[i]["a"] = 1
}
fmt.Println(temp_slice) //[map[a:1] map[a:1] map[a:1]]
//最好不要这样写
temp_slice2 := make([]map[string]int, 3)
for _, item := range temp_slice2 {
item = make(map[string]int) //注意:item仅是temp_slice2内部元素的副本
item["a"] = 1 //对item的值修改,不会影响temp_slice2内部元素的值
}
fmt.Println(temp_slice2) //[map[] map[] map[]]
}
map 排序
func Test_demo3(t *testing.T) {
temp_map := map[string]int{"e": 1, "f": 2, "c": 3, "g": 4, "w": 5}
temp_slice := make([]string, len(temp_map))
i := 0
for k, _ := range temp_map {
temp_slice[i] = k
i++
}
sort.Strings(temp_slice)
for _, val := range temp_slice {
fmt.Printf("map[%s]=%d ", val, temp_map[val])
//map[c]=3 map[e]=1 map[f]=2 map[g]=4 map[w]=5
}
}