在 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学习笔记 - 函数名前面是否有输入参数肯定是不一样的!!
golang [去阻塞频道]与Go#golang,#go,#go channels,#go synchronization,#goroutines,#waitgroups中的频道同步和阻止,