]> Cypherpunks repositories - gostls13.git/commitdiff
add a little text clarifying the behavior of 'select'
authorRob Pike <r@golang.org>
Thu, 2 Oct 2008 17:37:12 +0000 (10:37 -0700)
committerRob Pike <r@golang.org>
Thu, 2 Oct 2008 17:37:12 +0000 (10:37 -0700)
R=gri
DELTA=18  (8 added, 2 deleted, 8 changed)
OCL=16356
CL=16356

doc/go_spec.txt

index 3ab38bb36ef2a7726fde385a584f964f3eec4c0c..c43024a00d34a636d9fd2c9641f64d28dfbb3a38 100644 (file)
@@ -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