Thanks. I want the receiver always get the relately new vaule,  I don't 
want the sender blocked and I either choose drop the current value or the 
first value of the channel. But I don't find a way to safely drop the first 
value from the channel.

Maybe like this ?
```
// c  is buffered channel
select {
case c <- result:
default:
     // full, drop old one
     go func() {
          <-c
          c <- result
     }()
 }
```

在2020年11月13日星期五 UTC+8 上午11:27:23<Kurtis Rader> 写道:

> On Thu, Nov 12, 2020 at 6:19 PM 陶青云 <qing...@gmail.com> wrote:
>
>> ```
>>
> // c  is buffered channel
>> select {
>> case c <- result:
>> default:
>>      // full, drop old one
>>       <-c
>>       c <- result
>>  }
>> ```
>>
>> I have a code like this,  but there may be a race condition in the 
>> default case. I enconter a
>> deadlock that the goroutine block on  'c<'.
>>
>
> In addition to what Ian said you should note that a buffered channel is 
> essentially a FIFO queue. The equivalent code that operates on a queue in 
> any other language (e.g., Python) will have the same race. What you're 
> asking for is something like the behavior provided by an API such as 
> Python's collections.deque 
> <https://docs.python.org/2/library/collections.html#collections.deque>. 
> Whether any of the solutions you might find by searching for something like 
> "golang deque" satisfy your requirements can't be answered given the 
> information you have provided.
>
> -- 
> Kurtis Rader
> Caretaker of the exceptional canines Junior and Hank
>

-- 
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/af647672-b03e-4b1f-a688-249bfd316f07n%40googlegroups.com.

Reply via email to