aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2013-09-17 07:41:45 +1000
committerRob Pike <r@golang.org>2013-09-17 07:41:45 +1000
commit2a5dcfafec11744d55692838912901c58ba43bd2 (patch)
tree897527ff4f7d4403da02915ddcb0b1f962b62c08
parentcec0954dd04b585b1cadacbb5f46ae5ab76a371c (diff)
downloadgo-2a5dcfafec11744d55692838912901c58ba43bd2.tar.xz
effective_go: add a discussion of labeled break and continue
Fixes #5725. R=golang-dev, iant CC=golang-dev https://golang.org/cl/13705044
-rw-r--r--doc/effective_go.html43
1 files changed, 42 insertions, 1 deletions
diff --git a/doc/effective_go.html b/doc/effective_go.html
index 8c66fa246f..7d2a904e50 100644
--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -506,6 +506,8 @@ slightly generalized
<code>switch</code> is more flexible;
<code>if</code> and <code>switch</code> accept an optional
initialization statement like that of <code>for</code>;
+<code>break</code> and <code>continue</code> statements
+take an optional label to identify what to break or continue;
and there are new control structures including a type switch and a
multiway communications multiplexer, <code>select</code>.
The syntax is also slightly different:
@@ -781,7 +783,46 @@ func shouldEscape(c byte) bool {
</pre>
<p>
-Here's a comparison routine for byte slices that uses two
+Although they are not nearly as common in Go as some other C-like
+languages, <code>break</code> statements can be used to terminate
+a <code>switch</code> early.
+Sometimes, though, it's necessary to break out of a surrounding loop,
+not the switch, and in Go that can be accomplished by putting a label
+on the loop and "breaking" to that label.
+This example shows both uses.
+</p>
+
+<pre>
+Loop:
+ for n := 0; n &lt; len(src); n += size {
+ case src[n] &lt; sizeOne:
+ if validateOnly {
+ break
+ }
+ size = 1
+ update(src[n])
+
+ case src[n] &lt; sizeTwo:
+ if n+1 &gt;= len(src) {
+ err = errShortInput
+ break Loop
+ }
+ if validateOnly {
+ break
+ }
+ size = 2
+ update(src[n] + src[n+1]&lt;&lt;shift)
+ }
+ }
+</pre>
+
+<p>
+Of course, the <code>continue</code> statement also accepts an optional label
+but it applies only to loops.
+</p>
+
+<p>
+To close this section, here's a comparison routine for byte slices that uses two
<code>switch</code> statements:
</p>
<pre>