在go中键入不可知的通道

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)

  • 我想一般来说,在使用反射之前,你会想要使用一个类型开关.要获取类型名称,可以使用格式化选项%T和值.不需要"反思". (8认同)