在 go 中输入不可知的频道

Posted

技术标签:

【中文标题】在 go 中输入不可知的频道【英文标题】:Type agnostic channels in go 【发布时间】:2014-03-31 18:23:27 【问题描述】:

我仍然在思考 golang 中的接口。是否可以通过一个“通用”通道发送多种不同类型?

这是一个非常简单的例子:http://play.golang.org/p/7p2Bd6b0QT。

【问题讨论】:

play.golang.org/p/x_fgdhv-4EP 有点晚了,但修改了您的代码,使其实际工作。不过我不会那样写的。 @slaxor 5 年“有点”晚了吗? :D 【参考方案1】:

是的,这是可能的。例如,在您的代码中,您可以使用:

greet: make(chan pet)

然后你就可以无缝发送任何实现type pet interface的东西。

如果您想发送完全通用的东西,您可以使用chan interface,然后使用reflect 来了解您收到的东西是什么。


一个愚蠢的——可能不是惯用的——例子:

ch := make(chan interface)

go func() 
    select 
    case p := <-ch:
        fmt.Printf("Received a %q", reflect.TypeOf(p).Name())
    
() 
ch <- "this is it"

正如 BurntSushi5 指出的那样,类型切换更好:

p := <-ch
switch p := p.(type) 
case string:
    fmt.Printf("Got a string %q", p)
default:
    fmt.Printf("Type of p is %T. Value %v", p, p)

【讨论】:

我认为一般来说,您需要在使用反射之前使用类型开关。要获取类型名称,您可以使用带有值的格式化选项 %T。不需要reflect @BurntSushi5 感谢您的评论!

以上是关于在 go 中输入不可知的频道的主要内容,如果未能解决你的问题,请参考以下文章

接受任何频道的 go 函数

Ruby 中的 Go 频道

go-06-输入和输出

如何在Go中递归列出带有频道的文件?

GO学习笔记 - 函数名前面是否有输入参数肯定是不一样的!!

golang [去阻塞频道]与Go#golang,#go,#go channels,#go synchronization,#goroutines,#waitgroups中的频道同步和阻止,