Type agnostic channels in go

感情迁移 提交于 2019-12-03 10:20:16

问题


I'm still sort of wrapping my head around interfaces within golang. Is it possible to send multiple different types over a single, "generic" channel?

Here's a very simple example: http://play.golang.org/p/7p2Bd6b0QT.


回答1:


Yes, it's possible. For example in your code you could just use:

greet: make(chan pet)

And then you would be able to send seamlessly anything that implements type pet interface.

If you want to send something completely generic you can use a chan interface{} and then use reflect to find out what it is when you receive something.


A dumb - and probably not idiomatic - example:

ch := make(chan interface{})

go func() {
    select {
    case p := <-ch:
        fmt.Printf("Received a %q", reflect.TypeOf(p).Name())
    }
}() 
ch <- "this is it"

As BurntSushi5 points out, a type switch is better:

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)
}


来源:https://stackoverflow.com/questions/22083490/type-agnostic-channels-in-go

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!