Golang 中国
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
#1 heywap • 2017-11-03 17:10

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

haha03942008
#2 haha03942008 • 2017-11-05 09:33

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

heimeil
#3 heimeil • 2017-11-05 13:59

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

xinfeng
#4 xinfeng • 2017-11-06 14:34

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

haha03942008
#5 haha03942008 • 2017-11-06 15:41

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

hooluupog
#6 hooluupog • 2017-11-08 15:26
    go f()
    c <- 0
    <-time.NewTimer(time.Second).C
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。