我绝对是 Golang 的新手。我正在通过 Tour of Go 学习,然后用我自己的理解来实现想法。我在使用 goroutines 时遇到问题。我创建了一个无缓冲通道,然后向该通道发送了一个字符串。
func main() {
p := make(chan string)
p <- "Hello goroutine"
fmt.Println(<-p)
}
抛出错误
致命错误:所有 goroutines 都睡着了——死锁!
我明白了,频道是无缓冲的。(这就是原因。对吧?)。
但是当我重构p <- "Hello goroutine为一个 goroutine时
func main() {
p := make(chan string)
go sendHello(p)
fmt.Println(<-p)
}
func sendHello(p chan string) {
p <- "Hello goroutine"
}
它可以正常工作。我读到在大多数情况下我们不需要使用带有映射、切片和通道的指针来修改值。通过具有单独缓冲区的副本传递channel p给func sendHello(p chan string)。我仍然无法理解它。
catspeake
相关分类