【并行】初学者的疑惑

以下代码报错
fatal error: all goroutines are asleep - deadlock!

package main
import "fmt"

func main() {
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch)
}

当改为

package main

import "fmt"

func assign (ch chan int) {
    ch <- 1
}

func main() {
    ch := make(chan int)
    go assign (ch)

    fmt.Println(<-ch)
}

可打印出”1“

为什么会是这种结果?希望有大神解释一下,谢谢!

共 4 个回复


speedxer

简单点说,你定义的无缓冲通道,也是阻塞通道。
也就是说必须 写入一个必须要 取出之后, 才能再次写入(阻塞式的必须要在不同的协程 或者线程 才可以正常读写)。

你这阻塞在同一个线程了,所以才报死锁。

如果你定义为:
ch := make(chan int, 1)

或者只要大于等于1的就可以。

# 0

fising

楼上讲的很棒

# 1

vogel

@speedxer
谢谢,理解了

# 2

BruceWangNo1

因为你定义的channel是unbuffered。所以一旦有写入,并且还没有读取的时候,必定block。

# 3