一尘不染

在go中输入不可知的渠道

go

我仍然有点儿纠结于golang中的接口。是否可以通过单个“通用”通道发送多种不同类型的数据?

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


阅读 226

收藏
2020-07-02

共1个答案

一尘不染

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

greet: make(chan pet)

然后,您将能够无缝发送任何实现的内容type pet interface

如果您想发送 完全 通用的内容,可以使用a 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)
}
2020-07-02