私はまだgolang内のインターフェースに頭を悩ませています。単一の「汎用」チャネルを介して複数の異なるタイプを送信することは可能ですか?
非常に簡単な例を次に示します。 http://play.golang.org/p/7p2Bd6b0QT 。
はい、可能です。たとえば、コードでは次のように使用できます。
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)
}