From: Rob Pike Date: Thu, 2 Oct 2008 17:37:12 +0000 (-0700) Subject: add a little text clarifying the behavior of 'select' X-Git-Tag: weekly.2009-11-06~3058 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cd368a259e7734f0c4101bc4283202d8d1e22b22;p=gostls13.git add a little text clarifying the behavior of 'select' R=gri DELTA=18 (8 added, 2 deleted, 8 changed) OCL=16356 CL=16356 --- diff --git a/doc/go_spec.txt b/doc/go_spec.txt index 3ab38bb36e..c43024a00d 100644 --- a/doc/go_spec.txt +++ b/doc/go_spec.txt @@ -4,7 +4,7 @@ The Go Programming Language Specification (DRAFT) Robert Griesemer, Rob Pike, Ken Thompson ---- -(October 1 2008) +(October 2 2008) This document is a semi-formal specification of the Go systems @@ -2119,18 +2119,24 @@ cases all referring to communication operations. SelectStat = "select" "{" { CommClause } "}" . CommClause = CommCase [ StatementList [ ";" ] ] . - CommCase = ( "default" | ( "case" ( SendCase | RecvCase) ) ) ":" . - SendCase = SendExpr . - RecvCase = RecvExpr . + CommCase = ( "default" | ( "case" ( SendExpr | RecvExpr) ) ) ":" . SendExpr = Expression "<-" Expression . RecvExpr = [ PrimaryExpr ( "=" | ":=" ) ] "<-" Expression . -The select statement evaluates all the channel (pointers) involved. -If any of the channels can proceed, the corresponding communication -and statements are evaluated. Otherwise, if there is a default case, -that executes; if not, the statement blocks until one of the -communications can complete. A channel pointer may be nil, which is -equivalent to that case not being present in the select statement. +First, for all the send and receive expressions in the select +statement, the channel expression is evaluated. If any of the +resulting channels can proceed, one is chosen and the corresponding +communication (including the value to be sent, if any) and statements +are evaluated. Otherwise, if there is a default case, that executes; +if not, the statement blocks until one of the communications can +complete. The channels are not re-evaluated. A channel pointer +may be nil, which is equivalent to that case not being present in +the select statement. + +Note that since all the channels are evaluated, any side effects in +that evaluation will occur for all the channels in the select. On the +other hand, for sends, only the communication that proceeds has +its right-hand-side expression evaluated. If the channel sends or receives an interface type, its communication can proceed only if the type of the communication