golang:map

什么是map?

map是一个可以存储key/value对的一种数据结构,map像slice一样是引用类型,map内部实现是一个hash table,因此在map中存入的数据是无序的(map内部实现)。而每次从map中读取的数据也是无序的,因为golang在设计之初,map迭代器的顺序就是随机的,有别于C/C++,虽然存入map的数据是无序的,但是每次从map中读取的数据是一样的(为什么每次读取顺序不一样)。

声明和初始化
// 声明一个map,因为map是引用类型,所以m是nil
var m map[KeyType]ValueType

// 初始化方式一,空map,空并不是nil
m := map[KeyType]ValueType{}

//初始化方式二,两种初始化的方式是等价的
m := make(map[KeyType]ValueType)
基本操作
m := map[string]int{}
// 增加一个key/value对
m["Tony"] = 10

// 删除Key Tony
delete(m, "Tony")

// 修改Key Tony的值
m["Tony"] = 20

// 判断某个Key是否存在
if _, ok := m["Tony"]; ok {
    fmt.Println("Tony is exists")
}

// 遍历map
for key, value := range m {
    fmt.Printf("Key = %s, Value = %d", key, value)
}

// 使用多个值对map进行初始化
mp := map[string]int {
    "Tina": 10,
    "Divad": 20,
    "Tom": 5,
}
Key和Value可以使用什么类型?

Key :只要是可比较(可以使用==进行比较,两边的操作数可以相互赋值)的类型就可以,像整形,字符串类型,浮点型,数组(必须类型相同);而map,slice和function不能作为Key的类型。
Value :任何类型都可以。
map中关于Key和Value类型参考

对map进行并发访问时需增加同步机制

map在并发访问中使用不安全,因为不清楚当同时对map进行读写的时候会发生什么,如果像通过goroutine进行并发访问,则需要一种同步机制来保证访问数据的安全性。一种方式是使用sync.RWMutex

// 通过匿名结构体声明了一个变量counter,变量中包含了map和sync.RWMutex
var counter = struct{
    sync.RWMutex
    m map[string]int
}{m: make(map[string]int)}

// 读取数据的时候使用读锁
counter.RLock()
n := counter.m["Tony"]
counter.RUnlock()

// 写数据的使用使用写锁
counter.Lock()
counter.m["Tony"]++
counter.Unlock()

map并发访问参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在开发过程中,map是必不可少的数据结构,在Golang中,使用map或多或少会遇到与其他语言不一样的体验,比如访...
    Love语鬼阅读 30,425评论 7 36
  • map -类似其它语言中的哈希表或者字典,以key-value形式存储数据-Key必须是支持==或!=比较运算的类...
    战神汤姆阅读 135评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 8,353评论 0 16
  • 还没开始 就结束了 还没认识 已经走了 人生从没有彩排 开始就是直播 不管你 是戏子还是疯子, 不管你 是在别...
    燕南枝阅读 652评论 34 21