Go Map

golang go map 声明、赋值、循环

  • 声明格式

    1
    var map1 map[keytype]valuetype

    未初始化的map值是nil
    在声明的时候不需要知道 map 的长度,map 是可以动态增长的。

  • 声明与赋值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       var mapLit map[string]int
    //var mapCreated map[string]float32
    var mapAssigned map[string]int

    mapLit = map[string]int{"one": 1, "two": 2}
    mapCreated := make(map[string]float32)
    mapAssigned = mapLit

    mapCreated["key1"] = 4.5
    mapCreated["key2"] = 3.14159
    mapAssigned["two"] = 3

    fmt.Print(mapAssigned)
  • make 操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    map1 := make(map[string][]string)
    map2 := make(map[int]*[]int)

    map1["aa"] = []string{"a","b","cc"}
    map1["bb"] = []string{"a","b","cc"}

    fmt.Println(map1)
    fmt.Println(map2)
    //值读取
    k,v := map1["aa"]
    if v == false {
    panic("键值不存在")
    }
    fmt.Println(k,v)

    delete(map1,"aa")
    fmt.Println(map1)
  • map 循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    barVal := map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
    "delta": 87, "echo": 56, "foxtrot": 12,
    "golf": 34, "hotel": 16, "indio": 87,
    "juliet": 65, "kili": 43, "lima": 98}

    newMap := make([]string,len(barVal))
    i := 0
    for k,_ := range barVal{
    newMap[i] = k
    i ++
    }

    newMap2 := make(map[int]string,len(barVal))
    for k,v := range barVal{
    newMap2[v] = k
    }
    fmt.Print(newMap2)
    sort.Strings(newMap2)
    fmt.Println(newMap)
    sort.Strings(newMap)
    fmt.Println(newMap)
  • 不使用new,永远用make来构建map。

  • 如果错误的使用new()分配了一个引用对象,就会得到一个空引用指针,相当于声明了一个未初始化的变量并且取了它的地址

    1
    2
    3
    4
       mapCreated := new(map[string]float32)
    mapCreated["key1"] = 4.5
    fmt.Println(mapCreated)
    // 错误提示 invalid operation: mapCreated["key1"] (type *map[string]float32 does not support indexing)
  • 和数组不同,map 可以根据新增的 key-value 对动态的伸缩,因此它不存在固定长度或者最大限制。但是你也可以选择标明 map 的初始容量 capacity,就像这样:make(map[keytype]valuetype, cap)

  • 当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1。所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。

  • 判断key是否存在

    1
    2
    3
    4
    _, ok := map1[key1]     // 如果key1存在则ok == true,否在ok为false
    if _, ok := map1[key1]; ok {
    // ...
    }
  • 删除key

    1
    delete(map1, key1)  //如果 key1 不存在,该操作不会产生错误