ben*_*ier 11 interface channel go
我仍然有点围绕golang的界面.是否可以通过单个"通用"通道发送多种不同类型?
这是一个非常简单的例子:http://play.golang.org/p/7p2Bd6b0QT.
cni*_*tar 27
是的,这是可能的.例如,在您的代码中,您可以使用:
greet: make(chan pet)
Run Code Online (Sandbox Code Playgroud)
然后,您将能够无缝地发送任何实现的内容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"
Run Code Online (Sandbox Code Playgroud)
正如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)
}
Run Code Online (Sandbox Code Playgroud)