我正在嘗試在結(jié)構(gòu)中使用 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條經(jīng)驗 獲得超8個贊
goroutine 中的第一行從通道接收,在創(chuàng)建 goroutine 后 main 中的第一行也是如此。這意味著系統(tǒng)中僅有的兩個 goroutine 都試圖從切片通道接收,并且沒有人試圖向其中發(fā)送。
更一般地說,問題是對于某人接收(消費),其他人必須同時發(fā)送(生產(chǎn))。如果通道被緩沖(在您的示例中并非如此),則發(fā)送也可能在同一個 goroutine 中提前發(fā)生。
所以這是有效的,例如,因為通道有一個元素的緩沖區(qū),這意味著發(fā)送不會阻塞:
ch := make(chan int, 1)
ch <- 1
i := <-ch
這也有效,因為發(fā)送與接收同時發(fā)生:
ch := make(chan int)
go func() { ch <- 1 }()
i := <-ch
這并沒有工作,因為這兩個夠程要發(fā)送到的緩沖通道,沒有人試圖獲得:
ch := make(chan int)
go func() { ch <- 1 }()
ch <- 2
這并沒有任何工作,因為兩者都夠程嘗試接收,沒有人試圖發(fā)送:
ch := make(chan int)
go func() { <-ch }()
<-ch
最后一個是你的情況。
- 1 回答
- 0 關(guān)注
- 403 瀏覽
添加回答
舉報
0/150
提交
取消