以下是https://golang.org/ref/mem中的示例:
var c = make(chan int)
var a string
func f() {
a = "hello, world"
<-c
}
func main() {
go f()
c <- 0
print(a)
}
还可以保证打印“ hello,world”。对a的写操作发生在c上的接收之前,发生在相应的c上发送完成之前,发生在打印之前。
如果通道已缓冲(例如c = make(chan int,1)),则不能保证程序会打印“ hello,world”。 (它可能会打印空字符串,崩溃或执行其他操作。)
我了解It might print the empty string
,而不是crash
或do something else
,crash
何时会发生?何时do something else
?
答案 0 :(得分:3)
Go中的字符串是read only slice of bytes。 Slice由一个指针的长度组成。假设我们首先将length设置为较大的值,然后更改指针。另一个go例程可能首先读取新长度和旧指针。然后,它尝试读取前一个字符串的末尾。它要么读取一些垃圾,要么被操作系统停止并崩溃。
操作顺序并不重要,如果您先设置指针,则它可能指向对于当前长度而言太短的内存区域。