package main
import "fmt"
var money int = 100
var update = make(chan int)
func updateM( count int) {
update<- count
}
func main() {
updateM(200)
fmt.Println(<-update)
}
但当我更改代码以在updateM(200)前添加go 然后没有错误
func main() {
go updateM(200)
fmt.Println(<-update)
}
谁能告诉我,我是Go的新学习者。非常感谢。
答案 0 :(得分:4)
如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方仅阻塞,直到将值复制到缓冲区为止;如果缓冲区已满,则表示等待某个接收方检索到一个值。
您可以通过将频道创建更改为
来使其无法阻止var update = make(chan int, 1)
这样在频道阻止之前,频道中的一个项目就有空间。
答案 1 :(得分:2)
对无缓冲通道的写入将阻塞,直到有人在另一端读取它。在你的情况下updateM
将无限期地阻止,因为要继续,它需要继续,以便它可以从通道读取,它不能,因为它不是从通道读取。
频道用于goroutines之间的通信,它们与自己交谈没有意义。