【问题标题】:Golang - Using chan slice inside structGolang - 在结构中使用 chan 切片
【发布时间】:2013-09-13 15:17:39
【问题描述】:

我正在尝试在结构中使用 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)
}

【问题讨论】:

  • 这是我在play.golang.org/p/dLe0MIrLFw 试图弄清楚的事情,这就是为什么变量被命名为“blah”
  • 注释掉涉及 test 的两行并只放入 c.slice

标签: go freeze slice channel


【解决方案1】:

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

最后一个是你的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2022-10-23
    • 2015-08-31
    • 2016-02-22
    相关资源
    最近更新 更多