go map类似python字典
map是引用类型因此使用的时候需要先定义,比如用make 开辟一段空间。
map并发读写是存在问题的,就是我正在读的元素可能正在被修改那抹我读的就是错的,因此在map读写的时候需要加锁。
不加锁报错
package main
import (
"fmt"
"sync"
)
var Mutex sync.Mutex
var Map = make(map[string]int, 20)
func writeMap() {
for i := 0; i < 500; i++ {
key := fmt.Sprintf("stu_%d", i)
Map[key] = i
}
}
func readMap() {
for i := 0; i < 50; i++ {
key := fmt.Sprintf("stu_%d", i)
v, ok := Map[key]
if ok {
fmt.Printf("key : %s value: %d", key, v)
} else {
fmt.Println("nopt exist")
}
}
}
func main() {
fmt.Println("test")
go readMap()
go writeMap()
for {
}
}
报错如下:
fatal error: concurrent map read and map write
修改如下通过读写锁,读锁之间可以并行,但是写锁不能并行写,读与写互斥
package main
import (
"fmt"
"sync"
)
var Mutex sync.RWMutex
var Map = make(map[string]int, 20)
func writeMap() {
for i := 0; i < 10; i++ {
Mutex.Lock()
key := fmt.Sprintf("stu_%d", i)
Map[key] = i
Mutex.Unlock()
}
}
func readMap(id int) {
for i := 0; i < 5; i++ {
Mutex.RLock()
key := fmt.Sprintf("stu_%d", i)
v, ok := Map[key]
if ok {
fmt.Printf("thread 为 %d 读取到 key : %s value: %d\n", id, key, v)
} else {
fmt.Println("not exist\n")
}
Mutex.RUnlock()
}
}
func main() {
fmt.Println("test")
go writeMap()
go readMap(1)
go readMap(2)
go readMap(3)
for {
}
}
打印结果如下
thread 为 3 读取到 key : stu_0 value: 0
thread 为 3 读取到 key : stu_1 value: 1
thread 为 3 读取到 key : stu_2 value: 2
thread 为 3 读取到 key : stu_3 value: 3
thread 为 3 读取到 key : stu_4 value: 4
thread 为 1 读取到 key : stu_0 value: 0
thread 为 2 读取到 key : stu_0 value: 0
thread 为 2 读取到 key : stu_1 value: 1
thread 为 2 读取到 key : stu_2 value: 2