gpt4 book ai didi

Golang - 在结构中使用 chan slice

转载 作者:IT王子 更新时间:2023-10-29 01:24:15 25 4
gpt4 key购买 nike

我正在尝试在结构中使用 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 中的第一行从 channel 接收,goroutine 创建后的 main 中的第一行也是如此。这意味着系统中仅有的两个 goroutine 都试图从 slice channel 接收,没有人试图发送到它。

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

所以这是有效的,例如,因为 channel 有一个元素的缓冲区,这意味着发送不会阻塞:

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

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

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

有效,因为两个 goroutine 都试图发送到一个无缓冲的 channel ,并且没有人试图接收:

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

这也有效,因为两个 goroutine 都在尝试接收,但没有人在尝试发送:

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

最后一个是你的情况。

关于Golang - 在结构中使用 chan slice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18710010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com