Golang – 在struct中使用chan slice

前端之家收集整理的这篇文章主要介绍了Golang – 在struct中使用chan 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都试图从切片通道接收,没有人试图发送它.

更一般地说,问题是对于某人接收(消费),其他人必须同时发送(生产).如果通道是缓冲的(在您的示例中不是这种情况),则发送也可能在同一个goroutine中提前发生.

所以这很有用,例如,因为通道有一个元素的缓冲区,这意味着发送不会阻塞:

ch := make(chan int,1)
ch <- 1
i := <-ch

这也有效,因为发送与接收同时发生:

ch := make(chan int)
go func() { ch <- 1 }()
i := <-ch

这不起作用,因为两个goroutine都试图发送到一个无缓冲的通道,没有人试图接收:

ch := make(chan int)
go func() { ch <- 1 }()
ch <- 2

这也不起作用,因为两个goroutine都试图接收,没有人试图发送:

ch := make(chan int)
go func() { <-ch }()
<-ch

最后一个是你的情况.

猜你在找的Go相关文章