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

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

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

【问题讨论】:

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

标签: interface go channel


【解决方案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 感谢您的评论!
猜你喜欢
  • 2011-05-12
  • 2011-03-04
  • 2022-06-29
  • 2015-02-20
  • 1970-01-01
  • 2022-11-30
  • 2021-03-05
  • 2022-12-05
  • 1970-01-01
相关资源
最近更新 更多