]> Cypherpunks repositories - gostls13.git/commitdiff
faq: another way to solve the closure/variable/range complaint
authorRob Pike <r@golang.org>
Fri, 7 Sep 2012 16:11:39 +0000 (09:11 -0700)
committerRob Pike <r@golang.org>
Fri, 7 Sep 2012 16:11:39 +0000 (09:11 -0700)
It's easier just to declare a new variable.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6501103

doc/go_faq.html

index 8264e1940a80eaf999110bef0fa16ad00929120e..ea6edc37e90ccc339248536c3bbf58d6d312af3a 100644 (file)
@@ -1220,8 +1220,9 @@ but <code>v</code> may have been modified since the goroutine was launched.
 </p>
 
 <p>
-To bind the value of <code>v</code> to each closure as they are launched, one
-could modify the inner loop to read:
+To bind the current value of <code>v</code> to each closure as it is launched, one
+must modify the inner loop to create a new variable each iteration.
+One way is to pass the variable as an argument to the closure:
 </p>
 
 <pre>
@@ -1239,6 +1240,21 @@ anonymous function. That value is then accessible inside the function as
 the variable <code>u</code>.
 </p>
 
+<p>
+Even easier is just to create a new variable, using a declaration style that may
+seem odd but works fine in Go:
+</p>
+
+<pre>
+    for _, v := range values {
+        <b>v := v</b> // create a new 'v'.
+        go func() {
+            fmt.Println(<b>v</b>)
+            done &lt;- true
+        }()
+    }
+</pre>
+
 <h2 id="Control_flow">Control flow</h2>
 
 <h3 id="Does_Go_have_a_ternary_form">