Golang – 在struct中使用chan slice
发布时间:2020-12-16 19:03:53 所属栏目:大数据 来源:网络整理
导读:我试图在结构中使用切片chan类型,类似于下面的代码. 但是,当我尝试接收时 test := -c.slice 该程序挂起.有没有办法做到这一点? package mainimport "fmt"type blah struct { slice chan [][]int}func main() { slice := make([][]int,3) c := blah{make(cha
我试图在结构中使用切片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 最后一个是你的情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |