web-dev-qa-db-ja.com

Goで不可知論者のチャネルを入力します

私はまだgolang内のインターフェースに頭を悩ませています。単一の「汎用」チャネルを介して複数の異なるタイプを送信することは可能ですか?

非常に簡単な例を次に示します。 http://play.golang.org/p/7p2Bd6b0QT

12
ben lemasurier

はい、可能です。たとえば、コードでは次のように使用できます。

greet: make(chan pet)

そして、type pet interfaceを実装するものなら何でもシームレスに送信できます。

何かを送信したい場合完全に一般的なものを使用すると、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)
}
26
cnicutar