i4box’s Blog

What, Why, How ?

Golang Map 学习

一、定义

  1. 大概是这个样子的:

    map[KeyType]ValueType

  2. 传值or传引用

    golang map和string slice一样都为引用类型,传递时默认就是传指针的;

  3. 声明一个map

    var m map[string]int, m默认值为nil,如果直接使用会引起panic,必须先初始化;

  4. 初始化

    m = make(map[string]int)或者直接定义 m := map[string]int{};

  5. 插入

    m["hi"] = 1, key不存在相当于插入,存在相当于覆盖

  6. 删除

    delete(m, "hi"),key不存在也没有关系,不会进行任何操作;

  7. 判断key是否存在

    v, ok := m["hi"] key存在则ok返回为true,不存在ok未false

  8. 遍历

    for k, v := range map

二、map遍历操作是无序的

example

package main

import "fmt"

func main() {
    var m map[int]string
    m = make(map[int]string)
    for i := 0; i < 10; i++ {
        m[i] = "hi" 
    }

    for i := 0; i < 5; i++ {
        for k := range m {
            fmt.Print(k)
            fmt.Print(" ")
        }
        fmt.Println()
    }
}

result:

4 5 6 9 7 8 0 1 2 3
1 2 3 7 8 0 5 6 9 4
4 5 6 9 8 0 1 2 3 7
4 5 6 9 7 8 0 1 2 3
1 2 3 7 8 0 5 6 9 4    

需要有序遍历只能自己再弄一个sorted slice了,参考官方文档

三、并发访问安全

https://blog.golang.org/go-maps-in-action#TOC_6.

四、在range期间delete操作安全

结论

range期间delete操作是安全的

详细介绍

http://stackoverflow.com/questions/23229975/is-it-safe-to-remove-selected-keys-from-golang-map-within-a-range-loop