The third option was the expected one. Locking aside (as the thought line 
behind the original question), the time spent on preparing/calculating a 
result value to be sent to a channel, is not directly relevant to the case 
for nil channels - which were expected to get ignored. I do not understand 
the internals of select statement and did not know it locks the channel.

Thanks for the reply.

On Tuesday, January 23, 2018 at 11:42:17 PM UTC+3:30, Rob 'Commander' Pike 
wrote:
>
> Marvin: That's pretty much the thinking behind the design. Thanks for the 
> clear explanation.
>
> -rob
>
>
> On Wed, Jan 24, 2018 at 5:31 AM, Marvin Renich <mr...@renich.org 
> <javascript:>> wrote:
>
>> * dc0d <kaveh.sh...@gmail.com <javascript:>> [180123 08:45]:
>> > Can anybody help me understand the reason? (It's in the spec. That's not
>> > the reason)
>> >
>> > On Sunday, December 31, 2017 at 10:14:31 AM UTC+3:30, dc0d wrote:
>> > >
>> > > Assume there is this select statement:
>> > >
>> > > for {
>> > >     select {
>> > >     // ...
>> > >     // ...
>> > >
>> > >     case rcvd <- first():
>> > >     }
>> > > }
>> > >
>> > >
>> > > The rcvd channel will be set to nil or a chan value, by it's own case 
>> or
>> > > other cases.
>> > >
>> > > If the rcvd channel is nil, that case should have no effect. But even
>> > > when rcvd channel is nil, the first() function will be called.
>> > >
>> > > I did not expect that. Why is that so?
>>
>> There are several candidate designs for this.  Here is my analysis of
>> the choices that I think are most worthy of consideration:
>>
>> 1.  (The current spec)  Evaluate all channel operands (send and receive)
>> and all expressions for values to be sent.  Choose one of the
>> communication operations that is ready to proceed and do it.
>>
>> 2.  Evaluate all channel operands.  For all non-nil send channels,
>> evaluate all expressions for values to be sent.  Choose one of the
>> communication operations that is ready to proceed and do it.
>>
>> 3.  Evaluate all channel operands.  Choose one of the communication
>> operations that is ready to proceed.  If it is a send operation, now
>> evaluate its value expression.  Perform the operation.
>>
>> It is unclear to me whether you were expecting (2) or (3), but I don't
>> like either of these.
>>
>> I do not like (2) because it is not determinable until execution of the
>> select statement which expressions for send operations will be executed.
>> Some values that will not be sent may be evaluated even though they will
>> not be used, while others might not be evaluated.  This can vary from
>> one execution of the select statement to another within the same
>> invocation of the program.
>>
>> I do not like (3) because, in order to ensure that the communication
>> operation that was chosen is still ready to proceed after evaluating its
>> value to be sent, the channel must be locked during evaluation of the
>> value, blocking other go routines that try to use the channel.  This
>> might take any amount of time (e.g. tens of minutes, or even hours).
>> This goes completely against the design principles and goals of
>> channels.
>>
>> Thus (1) is the clear winner.  Did I miss the design that you were
>> expecting?
>>
>> ...Marvin
>>
>> --
>> 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...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to