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中文网其他相关文章!