interface - 在 go 中输入不可知的 channel

标签 interface go channel

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

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

最佳答案

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

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)
}

关于interface - 在 go 中输入不可知的 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083490/

相关文章:

PHP fatal error : Interface not found, 使用带命名空间的工厂模式

c# - 多态性——使用从接口(interface)继承的对象而不是直接使用接口(interface)

java - 使用对象和接口(interface)从 Map 对象获取 key

go - 将 interface{} 转换为在运行时计算的类型

go - 导入包时出错 (google.golang.org/api/option) : "error reading symbol: EOF"

go - 使用golang channel 缺少数据

go - 了解 golang 并发上下文中 channel 的正确使用

java - 标记界面的目的是什么?

html - 使用Golang的HTML模板中的发件人姓名邮件

go - 如何终止从 goroutine 调用的函数