为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - 在结构中使用 chan 切片

Golang - 在结构中使用 chan 切片

Go
温温酱 2021-06-27 16:12:19
我正在尝试在结构中使用 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

最后一个是你的情况。


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 370 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信