试图了解golang chan导致崩溃或执行其他操作

时间:2019-03-27 08:23:50

标签: go memory concurrency

以下是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,而不是crashdo something elsecrash何时会发生?何时do something else

1 个答案:

答案 0 :(得分:3)

Go中的字符串是read only slice of bytesSlice由一个指针的长度组成。假设我们首先将length设置为较大的值,然后更改指针。另一个go例程可能首先读取新长度和旧指针。然后,它尝试读取前一个字符串的末尾。它要么读取一些垃圾,要么被操作系统停止并崩溃。

操作顺序并不重要,如果您先设置指针,则它可能指向对于当前长度而言太短的内存区域。