登录
首页 >  Golang >  Go问答

将 chan 通道转换成输出 chan 通道

来源:stackoverflow

时间:2024-03-08 15:36:39 348浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《将 chan 通道转换成输出 chan 通道》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我想从函数中返回一个给定 []chan int[]<-chan int ,但即使转换也不起作用。

可以chan t 分配给 chan<- t<-chan t (隐式类型转换)。我不知道为什么你不能对一片chan做同样的事情。 afaik <- 只是一个编译时的东西(就像其他语言中的 const 一样),并且 chan<-chan 的内存布局是相同的。

我可以提供完整的代码示例,但本质上这就是我想要做的:

func f() []<-chan int {
    var chanList []chan int
    // setup writing to chans
    return chanList
}

这会产生编译错误:无法将 []<-chan int 用作 []chan int。如果我使用类型转换,也会发生同样的事情。将整个切片复制到新切片中是可行的,但看起来丑陋且多余(对于大切片来说效率低下)。


解决方案


在 go 中,[]<-chan int[]chan int 被视为不同的事物。尽管它们可能共享完全相同的内存结构。

将您的实现包装在自定义结构中怎么样?

package main

// roCh denotes a readonly channel
type roCh chan int

// Read is an exposed method for reading this channel
func (r roCh) Read() int { return <-r } 

func newChannels(n int) []roCh {
    roChs := make([]roCh, n)
    
    for i := range roChs {
        roChs[i] = roCh(make(chan int, 1))
        
        // Apply your channel logic here...
        // ...
    }
    
    return roChs
}

func main() {
    chs := newChannels(5)
    for _ = range chs {
        // channel readonly operation...
        // chs[i].Read()
    }
}

您可以向用户隐藏您的阅读频道的详细信息。它可以强制调用者使用方法 read 来读取这些通道的内容。

好了,本文到此结束,带大家了解了《将 chan 通道转换成输出 chan 通道》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>