因为 map 变量为 指针类型变量,并发写时,多个协程同时操作一个内存,类似于多线程操作同一个资源会发生竞争关系,共享资源会遭到破坏,因此golang 出于安全的考虑,抛出致命错误:fatal error: concurrent map writes。像本文出现的错误案例,也是因为自己没有多线程编程的思维基础,导致对这种问题不敏感,还是花了蛮多时间理解的。Go语言中的Map在并发情况下,只读是线程安全的,同时读写线程不安全。主要原因是对map进行读和写发生了竞态问题。map内部会对这种并发操作进行检查并提前发现。如果确实需要对map进行并发读写操作,可以采用加锁机制、channel同步机制,但这样性能并不高。
暂无评论