首页 >后端开发 >Golang >Go 的通道类型是不可知的吗?

Go 的通道类型是不可知的吗?

Linda Hamilton
Linda Hamilton原创
2024-11-04 13:00:29644浏览

Is Go's Channel Type Agnostic?

Go 中类型不可知的通道

问题:

可以发送多种不同的数据类型在 Go 中的单个通用通道上?

答案:

是的,这是可能的。使用 Playground 链接中提供的示例,可以使用以下语法创建通道:greet: make(chan pet);那么,任何实现 pet 接口的类型都可以通过该通道无缝发送。

为了实现完全的类型不可知论,可以使用 chan interface{} 类型的通道。当从这样的通道接收值时,可以使用反射来确定其类型。

示例:

演示此概念的简化示例(尽管可能不惯用) :

<code class="go">ch := make(chan interface{})

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

改进示例:

BurntSushi5 建议的替代方法使用类型开关:

<code class="go">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)
}</code>

以上是Go 的通道类型是不可知的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn