家里有台Mac mini是一直开机的,作为软路由使用,也作为跳板机连接到家里网络。今天试了下怎么用这个mac mini通过wake on lan唤醒windows主机。
... ➦简单说下问题:多个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如何避免该问题。
... ➦