golang语言map的并发和排序
- map的并发问题
golang缺省的map不是thread safe的,如果存在读写并发的使用场景,必须在外面使用lock机制。
包sync里面引入一个安全map;
type Map struct
func (m *Map) Store(key, value interface{})
func (m *Map) Load(key interface{}) (value interface{}, ok bool)
func (m *Map) Range(f func(key, value interface{}) bool)
func (m *Map) Delete(key interface{})
用法:
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
m.Store("bb", 22)
m.Store("cc", 33)
m.Store("aa", 11)
v, ok := m.Load("cc")
fmt.Printf("%v: %v\n", v, ok)
m.Delete("cc")
m.Range(func(key, value interface{}) bool{
fmt.Printf("[%v]=[%v]\n", key, value)
return true
})
}
运行结果如下:
33: true
[bb]=[22]
[aa]=[11]
- map排序的问题
golang官方说法map并不排序,不按key排序,也不按插入顺序排序,也就是说map是无序的,无法保证任何排序。
下面是一种常见的给map排序输出的办法:
m := map[string]int{"Alice": 23, "Eve": 2, "Bob": 25}
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
有疑问加站长微信联系(非本文作者)