我知道通过交换第15行和第17行不会出错,但是,我不明白为什么不交换会导致死锁
package main
import (
"fmt"
)
func greet(c chan string) {
fmt.Println("Hello " + <-c + "!")
}
func main() {
c := make(chan string)
//line15
c <- "John"
//line17
go greet(c)
}
致命错误:所有goroutine都在睡觉-死锁!
答案 0 :(得分:3)
通道c
未缓冲。在发送方和接收方都准备就绪之前,无法进行无缓冲通道上的通信。
程序死锁是因为当主goroutine执行发送操作时,没有接收器准备就绪。
答案 1 :(得分:0)
您可以这样做
package main
import (
"fmt"
"sync"
)
func greet(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Hello " + <-c + "!")
}
func main() {
c := make(chan string, 10)
//line15
c <- "John"
//line17
var wg sync.WaitGroup
wg.Add(1)
go greet(c, &wg)
c <- "Alex"
wg.Add(1)
go greet(c, &wg)
wg.Wait()
}