【发布时间】:2013-12-25 10:32:22
【问题描述】:
我是 Go 新手,但对于在 Linux 上运行 Go 版本 1.2 的一小段代码似乎有点罕见的竞争条件感到困惑。
基本上,我为int 创建一个通道,启动一个 go 例程从通道读取,然后将一个 int 写入通道。
package main
import "fmt"
func main() {
channel := make(chan int)
go func() {
number := <- channel
fmt.Printf("GOT IT: %d\n", number)
}()
fmt.Println("[+] putting num on channel")
channel <- 42
fmt.Println("[-] putting num on channel")
}
大约 90% 的时间输出符合预期:
$ go run test.go
[+] putting num on channel
GOT IT: 42
[-] putting num on channel
然而,大约 10% 的时间,go 例程根本不会从通道中读取数字并且什么也不打印:
$ go run test.go
[+] putting num on channel
[-] putting num on channel
我很困惑,因为这段代码与https://gobyexample.com/channels 的示例非常相似(我没有这个问题),只是我在 go 例程中从通道读取而不是写入通道.
我是否对渠道的运作方式存在根本性的误解,还是这里有其他原因?
【问题讨论】: