美文网首页
Go字典类型的使用

Go字典类型的使用

作者: 喜龙爱慧 | 来源:发表于2016-06-23 18:24 被阅读1883次
peace&Dola Sun 作品

时光驯服一切,我与往事之间,像回声,再怎么千回百转,终究消失在山谷。 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
    }
}

相关文章

网友评论

      本文标题:Go字典类型的使用

      本文链接:https://www.haomeiwen.com/subject/iczndttx.html