Golang僵局

时间:2019-06-25 03:46:40

标签: go

我知道通过交换第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都在睡觉-死锁!

2 个答案:

答案 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()

}