The reason you're wanting priority select is because you are shutting down
the data channel preemptively, but you can wait for an acknowledgement from
the run goroutine instead:

https://play.golang.org/p/qSWluYy4ifl


On Wed, 28 Aug 2019 at 18:06, T L <tapir....@gmail.com> wrote:

> The old thread:
> https://groups.google.com/forum/#!topic/golang-nuts/ZrVIhHCrR9o
>
> Go channels are flexible, but in practice, I often encountered some
> situations in which channel are hard to use.
> Given an example:
>
> import "math/rand"
>
> type Producer struct {
>     data   chan int
>     closed chan struct{}
> }
>
> func NewProducer() *Producer {
>     p := &Producer {
>         data:   make(chan int),
>         closed: make(chan struct{}),
>     }
>
>     go p.run()
>
>     return p
> }
>
> func (p *Produce) Stream() chan int {
>     return p.data
> }
>
> func (p *Producer) run() {
>     for {
>         // If non-blocking cases are selected by their appearance order,
>         // then the following slect block is a perfect use.
>         select {
>         case(0) <-p.closed: return
>         case p.data <- rand.Int():
>         }
>     }
> }
>
> func (p *Produce) Clsoe() {
>     close(p.closed)
>     close(p.data)
> }
>
> func main() {
>     p := NewProducer()
>     for n := p.Stream() {
>         // use n ...
>     }
> }
>
>
> If the first case in the select block in the above example has a higher
> priority than the second one,
> then coding will be much happier for the use cases like the above one.
>
> In short, the above use case requires:
> * for receivers, data streaming end is notified by the close of a channel.
> * for senders, data will never be sent to closed channel.
>
> But, as Go 1 doesn't support priority select cases, it is much tedious to
> implement the code
> satisfying the above listed requirements. The final implementation is
> often very ugly and inefficient.
>
> Does anyone else also experience the pain?
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/e3015cd8-c2ec-479e-927d-b9ad762d277e%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/e3015cd8-c2ec-479e-927d-b9ad762d277e%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAJhgacgdNrNCsEN_-oAPAbzLwq6fhakuvPjg3%3Dyg-VLTe1hkqQ%40mail.gmail.com.

Reply via email to