简单说下问题:多个 goroutine 并发读写 string,读取 string(fmt.Println和json.Marshal)的 goroutine 会 panic。根因是 string 是一个胖指针,除了 pointer 字段之外还有一个 len 字段的元数据。在给 string 变量赋值(拷贝)时,会逐个设置 pointer 和 len 字段,这个过程不是原子的。在有并发修改时,pointer 和 len 就不一致了,这时就回发生问题:当 len 不为 0,pointer 为 nil(0x0)时,就会panic: runtime error: invalid memory address or nil pointer dereference。
本文首先探究下为什么 golang string 有这个问题,然后对比下 java 的 string 为什么没这个问题,最后介绍数据争用(data race)问题以及 Golang 和 Rust 如何避免该问题。
... ➦如何快速关闭WeGame和LOL客户端?恶心的wegame总是在关闭游戏的时候浪费我时间,所以写了一个批处理文件,一键关闭wegame和LOL客户端。
... ➦