tho*_*mas 5 channel hang go slice
我试图在结构中使用切片chan类型,类似于下面的代码.但是,当我尝试接收时
test := <-c.slice
Run Code Online (Sandbox Code Playgroud)
该程序挂起.有没有办法做到这一点?
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)
}
Run Code Online (Sandbox Code Playgroud)
Gus*_*yer 10
goroutine中的第一行从通道接收,在创建goroutine之后,main中的第一行也是如此.这意味着系统中只有两个goroutine都试图从切片通道接收,没有人试图发送它.
更一般地说,问题是对于某人接收(消费),其他人必须同时发送(生产).如果通道是缓冲的(在您的示例中不是这种情况),则发送也可能在同一个goroutine中提前发生.
所以这很有用,例如,因为通道有一个元素的缓冲区,这意味着发送不会阻塞:
ch := make(chan int, 1)
ch <- 1
i := <-ch
Run Code Online (Sandbox Code Playgroud)
这也有效,因为发送与接收同时发生:
ch := make(chan int)
go func() { ch <- 1 }()
i := <-ch
Run Code Online (Sandbox Code Playgroud)
这并没有工作,因为这两个够程要发送到的缓冲通道,没有人试图获得:
ch := make(chan int)
go func() { ch <- 1 }()
ch <- 2
Run Code Online (Sandbox Code Playgroud)
这并没有任何工作,因为两者都够程尝试接收,没有人试图发送:
ch := make(chan int)
go func() { <-ch }()
<-ch
Run Code Online (Sandbox Code Playgroud)
最后一个是你的情况.
| 归档时间: |
|
| 查看次数: |
6026 次 |
| 最近记录: |