Go笔记-map

【概念】
    1- map 是引用类型的
    2- 声明方式
        var map1 map[keytype]valuetype    
        例如:var map1 map[string]int
    3- map是可以动态自增长的
    4- 未初始化的map的值是nil
    5- 可以是任意用==或者!=操作符比较的类型,比如string,int,float。不常用的还有指针和接口类型也可以。切片和结构体不行(如果要用结构体做key,需要做变通,使用提供Key(),Hash()方法)
    6- value可以是任意值
    7- map传递给函数的代价很小,在32位机器上占4个字节,在64位机器上占用8个字节,无论实际存储了多少数据。
        备注:在map中查找比线性查找快,但是比数组和切片的索引中直接读取要慢100倍,在乎性能请使用切片或数组
    8- 不要使用new来构造map,永远使用make来构造map
        备注:若使用了new()分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取得了它的地址
 
 
【map容量】
    map的长度是动态的,它不存在固定长度和限制最大长度,但是我们也可以标明map的初始容量:make(map[int]string, cap),出于性能考虑还是应该在大容量和快速扩张的map中标明初始化容量
 
 
【map的常用操作】
    1- 测试键值对是否存在
            备注:map[key]  有两个返回值,第一个是该map键对应的值,第二个返回值是True(该键对应有值)或False(该键对应没有值)
 1 _,ok := map[key]
 2 if _,ok := map[key];ok{
 3     // do something
 4 }
 5 package main
 6 func main(){
 7     mf := make(map[int]string,2)
 8     mf[1] = "hello"
 9     mf[2] = "world"
10  
11     // 测试键值是否存在
12     if _,ok := mf[1];ok{
13         fmt.Printtf("key %d exists")
14     }else{
15         fmt.Printf("key %d unexists")
16     }
17  
18     // 删除键值
19     delete(mf,1)
20 }
    2- 删除键值对
            delete(mf, 1)
 
 
【map的for-range输出值】
    map既不是按照key的顺序排列的,也不是按照value的值排列的,每次输出都是随机
 1 package main
 2  
 3 import "fmt"
 4  
 5 func main(){
 6     mf := map[int]string{1:"hello",2:"world"}
 7     for key := range mf{
 8         // 每次运行输出的顺序都不同
 9         fmt.Printf("%d = %s",key,mf[key])
10     }
11 }
 
 
package main

func main(){
    // map的值是一个函数
    mf := map[int]func() int{
        1:func()int{return 10},
        2:func()int{return 20},
    }
 
    // map的值是一个切片
    mf1 := make(map[int][]string)
    mf2 := make(map[int]*[]string)
}
  【学习参考处:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md】
原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/7895017.html