猿问

Golang - 在结构中使用 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)

}


温温酱
浏览 371回答 1
1回答

弑天下

goroutine 中的第一行从通道接收,在创建 goroutine 后 main 中的第一行也是如此。这意味着系统中仅有的两个 goroutine 都试图从切片通道接收,并且没有人试图向其中发送。更一般地说,问题是对于某人接收(消费),其他人必须同时发送(生产)。如果通道被缓冲(在您的示例中并非如此),则发送也可能在同一个 goroutine 中提前发生。所以这是有效的,例如,因为通道有一个元素的缓冲区,这意味着发送不会阻塞:ch := make(chan int, 1)ch <- 1i := <-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最后一个是你的情况。
随时随地看视频慕课网APP

相关分类

Go
我要回答