Type agnostic channels in go

后端 未结 1 966
走了就别回头了
走了就别回头了 2021-02-02 17:57

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 s

相关标签:
1条回答
  • 2021-02-02 18:10

    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)
    }
    
    0 讨论(0)
提交回复
热议问题