这段代码为什么会报错死锁啊!!!!!!!!!!

package main

import (
    "fmt"
)

var c = make(chan int)

func f() {
    a := "hello, world"
    d := <-c
    fmt.Println(d)
    fmt.Println(a)
}
func main() {
    c <- 0
    go f()

}

这段代码为什么会报错死锁啊!!!!!!!!!!

共 6 个回复


heywap

var c = make(chan int) 这种方式创建的协程是阻塞的,在这一句 c <- 0 ,你往通道发送一个值,然后程序就阻塞在当前位置,直到另一个协程来接收,但是并没有接收有协程,所以一直卡在这里。

# 0

haha03942008

但是我在f()这个函数里接收了啊,吧c<-0放在go f()下面就是能用啊

# 1

heimeil

c <- 0已经阻塞等待了,就不会执行后面的go f()

# 2

xinfeng

给通道加个大小
var c = make(chan int, 1)

# 3

haha03942008

又看了一遍channel介绍,说是阻塞的只能先取再给,谢谢大家

# 4

hooluupog

    go f()
    c <- 0
    <-time.NewTimer(time.Second).C
# 5