我正在尝试在结构内使用slice chan类型,类似于下面的代码。但是,当我尝试接收
test := <-c.slice
程序挂起。有没有办法做到这一点?
package main import "fmt" type blah struct { slice chan [][]int } func main() { slice := make([][]int, 3) c := blah{make(chan [][]int)} slice[0] = []int{1, 2, 3} slice[1] = []int{4, 5, 6} slice[2] = []int{7, 8, 9} go func() { test := <- c.slice test = slice c.slice <- test }() fmt.Println(<-c.slice) }
goroutine中的第一行从通道接收,创建goroutine之后的main中的第一行也是如此。这意味着系统中仅有的两个goroutine都试图从slice通道接收,而没有人试图发送到其中。
更一般而言,问题是要使某人接收(消费),其他人必须同时发送(产生)。如果通道是缓冲的(在您的示例中不是这种情况),则发送也可能在同一goroutine中提前发生。
举例来说,这是可行的,因为通道的缓冲区只有一个元素,这意味着发送不会阻塞:
ch := make(chan int, 1) ch <- 1 i := <-ch
这也很好,因为发送与接收同时发生:
ch := make(chan int) go func() { ch <- 1 }() i := <-ch
这并 没有 工作,因为这两个够程要发送到的缓冲通道,没有人试图获得:
ch := make(chan int) go func() { ch <- 1 }() ch <- 2
这并 没有 任何工作,因为两者都够程尝试接收,没有人试图发送:
ch := make(chan int) go func() { <-ch }() <-ch
最后一个是你的情况。