我正在尝试在结构中使用 slice chan 类型,类似于下面的代码。但是,当我尝试在test := <-c.slice程序挂了。有没有办法做到这一点?package mainimport "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)}
1 回答
弑天下
TA贡献1818条经验 获得超8个赞
goroutine 中的第一行从通道接收,在创建 goroutine 后 main 中的第一行也是如此。这意味着系统中仅有的两个 goroutine 都试图从切片通道接收,并且没有人试图向其中发送。
更一般地说,问题是对于某人接收(消费),其他人必须同时发送(生产)。如果通道被缓冲(在您的示例中并非如此),则发送也可能在同一个 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
最后一个是你的情况。
- 1 回答
- 0 关注
- 370 浏览
添加回答
举报
0/150
提交
取消