blob: 4dd1a3e017f562788bd6353f2db82f29523dbd01 [file] [log] [blame]
Brent Austinba3052e2015-04-21 16:08:23 -07001<!--{
2 "Title": "Effective Go",
3 "Template": true
4}-->
5
6<h2 id="introduction">Introduction</h2>
7
8<p>
9Go is a new language. Although it borrows ideas from
10existing languages,
11it has unusual properties that make effective Go programs
12different in character from programs written in its relatives.
13A straightforward translation of a C++ or Java program into Go
14is unlikely to produce a satisfactory result&mdash;Java programs
15are written in Java, not Go.
16On the other hand, thinking about the problem from a Go
17perspective could produce a successful but quite different
18program.
19In other words,
20to write Go well, it's important to understand its properties
21and idioms.
22It's also important to know the established conventions for
23programming in Go, such as naming, formatting, program
24construction, and so on, so that programs you write
25will be easy for other Go programmers to understand.
26</p>
27
28<p>
29This document gives tips for writing clear, idiomatic Go code.
30It augments the <a href="/ref/spec">language specification</a>,
31the <a href="//tour.golang.org/">Tour of Go</a>,
32and <a href="/doc/code.html">How to Write Go Code</a>,
33all of which you
34should read first.
35</p>
36
37<h3 id="examples">Examples</h3>
38
39<p>
40The <a href="/src/">Go package sources</a>
41are intended to serve not
42only as the core library but also as examples of how to
43use the language.
44Moreover, many of the packages contain working, self-contained
45executable examples you can run directly from the
46<a href="//golang.org">golang.org</a> web site, such as
47<a href="//golang.org/pkg/strings/#example_Map">this one</a> (if
48necessary, click on the word "Example" to open it up).
49If you have a question about how to approach a problem or how something
50might be implemented, the documentation, code and examples in the
51library can provide answers, ideas and
52background.
53</p>
54
55
56<h2 id="formatting">Formatting</h2>
57
58<p>
59Formatting issues are the most contentious
60but the least consequential.
61People can adapt to different formatting styles
62but it's better if they don't have to, and
63less time is devoted to the topic
64if everyone adheres to the same style.
65The problem is how to approach this Utopia without a long
66prescriptive style guide.
67</p>
68
69<p>
70With Go we take an unusual
71approach and let the machine
72take care of most formatting issues.
73The <code>gofmt</code> program
74(also available as <code>go fmt</code>, which
75operates at the package level rather than source file level)
76reads a Go program
77and emits the source in a standard style of indentation
78and vertical alignment, retaining and if necessary
79reformatting comments.
80If you want to know how to handle some new layout
81situation, run <code>gofmt</code>; if the answer doesn't
82seem right, rearrange your program (or file a bug about <code>gofmt</code>),
83don't work around it.
84</p>
85
86<p>
87As an example, there's no need to spend time lining up
88the comments on the fields of a structure.
89<code>Gofmt</code> will do that for you. Given the
90declaration
91</p>
92
93<pre>
94type T struct {
95 name string // name of the object
96 value int // its value
97}
98</pre>
99
100<p>
101<code>gofmt</code> will line up the columns:
102</p>
103
104<pre>
105type T struct {
106 name string // name of the object
107 value int // its value
108}
109</pre>
110
111<p>
112All Go code in the standard packages has been formatted with <code>gofmt</code>.
113</p>
114
115
116<p>
117Some formatting details remain. Very briefly:
118</p>
119
120<dl>
121 <dt>Indentation</dt>
122 <dd>We use tabs for indentation and <code>gofmt</code> emits them by default.
123 Use spaces only if you must.
124 </dd>
125 <dt>Line length</dt>
126 <dd>
127 Go has no line length limit. Don't worry about overflowing a punched card.
128 If a line feels too long, wrap it and indent with an extra tab.
129 </dd>
130 <dt>Parentheses</dt>
131 <dd>
132 Go needs fewer parentheses than C and Java: control structures (<code>if</code>,
133 <code>for</code>, <code>switch</code>) do not have parentheses in
134 their syntax.
135 Also, the operator precedence hierarchy is shorter and clearer, so
136<pre>
137x&lt;&lt;8 + y&lt;&lt;16
138</pre>
139 means what the spacing implies, unlike in the other languages.
140 </dd>
141</dl>
142
143<h2 id="commentary">Commentary</h2>
144
145<p>
146Go provides C-style <code>/* */</code> block comments
147and C++-style <code>//</code> line comments.
148Line comments are the norm;
149block comments appear mostly as package comments, but
150are useful within an expression or to disable large swaths of code.
151</p>
152
153<p>
154The program—and web server—<code>godoc</code> processes
155Go source files to extract documentation about the contents of the
156package.
157Comments that appear before top-level declarations, with no intervening newlines,
158are extracted along with the declaration to serve as explanatory text for the item.
159The nature and style of these comments determines the
160quality of the documentation <code>godoc</code> produces.
161</p>
162
163<p>
164Every package should have a <i>package comment</i>, a block
165comment preceding the package clause.
166For multi-file packages, the package comment only needs to be
167present in one file, and any one will do.
168The package comment should introduce the package and
169provide information relevant to the package as a whole.
170It will appear first on the <code>godoc</code> page and
171should set up the detailed documentation that follows.
172</p>
173
174<pre>
175/*
176Package regexp implements a simple library for regular expressions.
177
178The syntax of the regular expressions accepted is:
179
180 regexp:
181 concatenation { '|' concatenation }
182 concatenation:
183 { closure }
184 closure:
185 term [ '*' | '+' | '?' ]
186 term:
187 '^'
188 '$'
189 '.'
190 character
191 '[' [ '^' ] character-ranges ']'
192 '(' regexp ')'
193*/
194package regexp
195</pre>
196
197<p>
198If the package is simple, the package comment can be brief.
199</p>
200
201<pre>
202// Package path implements utility routines for
203// manipulating slash-separated filename paths.
204</pre>
205
206<p>
207Comments do not need extra formatting such as banners of stars.
208The generated output may not even be presented in a fixed-width font, so don't depend
209on spacing for alignment&mdash;<code>godoc</code>, like <code>gofmt</code>,
210takes care of that.
211The comments are uninterpreted plain text, so HTML and other
212annotations such as <code>_this_</code> will reproduce <i>verbatim</i> and should
213not be used.
214One adjustment <code>godoc</code> does do is to display indented
215text in a fixed-width font, suitable for program snippets.
216The package comment for the
217<a href="/pkg/fmt/"><code>fmt</code> package</a> uses this to good effect.
218</p>
219
220<p>
221Depending on the context, <code>godoc</code> might not even
222reformat comments, so make sure they look good straight up:
223use correct spelling, punctuation, and sentence structure,
224fold long lines, and so on.
225</p>
226
227<p>
228Inside a package, any comment immediately preceding a top-level declaration
229serves as a <i>doc comment</i> for that declaration.
230Every exported (capitalized) name in a program should
231have a doc comment.
232</p>
233
234<p>
235Doc comments work best as complete sentences, which allow
236a wide variety of automated presentations.
237The first sentence should be a one-sentence summary that
238starts with the name being declared.
239</p>
240
241<pre>
242// Compile parses a regular expression and returns, if successful, a Regexp
243// object that can be used to match against text.
244func Compile(str string) (regexp *Regexp, err error) {
245</pre>
246
247<p>
248If the name always begins the comment, the output of <code>godoc</code>
249can usefully be run through <code>grep</code>.
250Imagine you couldn't remember the name "Compile" but were looking for
251the parsing function for regular expressions, so you ran
252the command,
253</p>
254
255<pre>
256$ godoc regexp | grep parse
257</pre>
258
259<p>
260If all the doc comments in the package began, "This function...", <code>grep</code>
261wouldn't help you remember the name. But because the package starts each
262doc comment with the name, you'd see something like this,
263which recalls the word you're looking for.
264</p>
265
266<pre>
267$ godoc regexp | grep parse
268 Compile parses a regular expression and returns, if successful, a Regexp
269 parsed. It simplifies safe initialization of global variables holding
270 cannot be parsed. It simplifies safe initialization of global variables
271$
272</pre>
273
274<p>
275Go's declaration syntax allows grouping of declarations.
276A single doc comment can introduce a group of related constants or variables.
277Since the whole declaration is presented, such a comment can often be perfunctory.
278</p>
279
280<pre>
281// Error codes returned by failures to parse an expression.
282var (
283 ErrInternal = errors.New("regexp: internal error")
284 ErrUnmatchedLpar = errors.New("regexp: unmatched '('")
285 ErrUnmatchedRpar = errors.New("regexp: unmatched ')'")
286 ...
287)
288</pre>
289
290<p>
291Grouping can also indicate relationships between items,
292such as the fact that a set of variables is protected by a mutex.
293</p>
294
295<pre>
296var (
297 countLock sync.Mutex
298 inputCount uint32
299 outputCount uint32
300 errorCount uint32
301)
302</pre>
303
304<h2 id="names">Names</h2>
305
306<p>
307Names are as important in Go as in any other language.
308They even have semantic effect:
309the visibility of a name outside a package is determined by whether its
310first character is upper case.
311It's therefore worth spending a little time talking about naming conventions
312in Go programs.
313</p>
314
315
316<h3 id="package-names">Package names</h3>
317
318<p>
319When a package is imported, the package name becomes an accessor for the
320contents. After
321</p>
322
323<pre>
324import "bytes"
325</pre>
326
327<p>
328the importing package can talk about <code>bytes.Buffer</code>. It's
329helpful if everyone using the package can use the same name to refer to
330its contents, which implies that the package name should be good:
331short, concise, evocative. By convention, packages are given
332lower case, single-word names; there should be no need for underscores
333or mixedCaps.
334Err on the side of brevity, since everyone using your
335package will be typing that name.
336And don't worry about collisions <i>a priori</i>.
337The package name is only the default name for imports; it need not be unique
338across all source code, and in the rare case of a collision the
339importing package can choose a different name to use locally.
340In any case, confusion is rare because the file name in the import
341determines just which package is being used.
342</p>
343
344<p>
345Another convention is that the package name is the base name of
346its source directory;
347the package in <code>src/encoding/base64</code>
348is imported as <code>"encoding/base64"</code> but has name <code>base64</code>,
349not <code>encoding_base64</code> and not <code>encodingBase64</code>.
350</p>
351
352<p>
353The importer of a package will use the name to refer to its contents,
354so exported names in the package can use that fact
355to avoid stutter.
356(Don't use the <code>import .</code> notation, which can simplify
357tests that must run outside the package they are testing, but should otherwise be avoided.)
358For instance, the buffered reader type in the <code>bufio</code> package is called <code>Reader</code>,
359not <code>BufReader</code>, because users see it as <code>bufio.Reader</code>,
360which is a clear, concise name.
361Moreover,
362because imported entities are always addressed with their package name, <code>bufio.Reader</code>
363does not conflict with <code>io.Reader</code>.
364Similarly, the function to make new instances of <code>ring.Ring</code>&mdash;which
365is the definition of a <em>constructor</em> in Go&mdash;would
366normally be called <code>NewRing</code>, but since
367<code>Ring</code> is the only type exported by the package, and since the
368package is called <code>ring</code>, it's called just <code>New</code>,
369which clients of the package see as <code>ring.New</code>.
370Use the package structure to help you choose good names.
371</p>
372
373<p>
374Another short example is <code>once.Do</code>;
375<code>once.Do(setup)</code> reads well and would not be improved by
376writing <code>once.DoOrWaitUntilDone(setup)</code>.
377Long names don't automatically make things more readable.
378A helpful doc comment can often be more valuable than an extra long name.
379</p>
380
381<h3 id="Getters">Getters</h3>
382
383<p>
384Go doesn't provide automatic support for getters and setters.
385There's nothing wrong with providing getters and setters yourself,
386and it's often appropriate to do so, but it's neither idiomatic nor necessary
387to put <code>Get</code> into the getter's name. If you have a field called
388<code>owner</code> (lower case, unexported), the getter method should be
389called <code>Owner</code> (upper case, exported), not <code>GetOwner</code>.
390The use of upper-case names for export provides the hook to discriminate
391the field from the method.
392A setter function, if needed, will likely be called <code>SetOwner</code>.
393Both names read well in practice:
394</p>
395<pre>
396owner := obj.Owner()
397if owner != user {
398 obj.SetOwner(user)
399}
400</pre>
401
402<h3 id="interface-names">Interface names</h3>
403
404<p>
405By convention, one-method interfaces are named by
406the method name plus an -er suffix or similar modification
407to construct an agent noun: <code>Reader</code>,
408<code>Writer</code>, <code>Formatter</code>,
409<code>CloseNotifier</code> etc.
410</p>
411
412<p>
413There are a number of such names and it's productive to honor them and the function
414names they capture.
415<code>Read</code>, <code>Write</code>, <code>Close</code>, <code>Flush</code>,
416<code>String</code> and so on have
417canonical signatures and meanings. To avoid confusion,
418don't give your method one of those names unless it
419has the same signature and meaning.
420Conversely, if your type implements a method with the
421same meaning as a method on a well-known type,
422give it the same name and signature;
423call your string-converter method <code>String</code> not <code>ToString</code>.
424</p>
425
426<h3 id="mixed-caps">MixedCaps</h3>
427
428<p>
429Finally, the convention in Go is to use <code>MixedCaps</code>
430or <code>mixedCaps</code> rather than underscores to write
431multiword names.
432</p>
433
434<h2 id="semicolons">Semicolons</h2>
435
436<p>
437Like C, Go's formal grammar uses semicolons to terminate statements,
438but unlike in C, those semicolons do not appear in the source.
439Instead the lexer uses a simple rule to insert semicolons automatically
440as it scans, so the input text is mostly free of them.
441</p>
442
443<p>
444The rule is this. If the last token before a newline is an identifier
445(which includes words like <code>int</code> and <code>float64</code>),
446a basic literal such as a number or string constant, or one of the
447tokens
448</p>
449<pre>
450break continue fallthrough return ++ -- ) }
451</pre>
452<p>
453the lexer always inserts a semicolon after the token.
454This could be summarized as, &ldquo;if the newline comes
455after a token that could end a statement, insert a semicolon&rdquo;.
456</p>
457
458<p>
459A semicolon can also be omitted immediately before a closing brace,
460so a statement such as
461</p>
462<pre>
463 go func() { for { dst &lt;- &lt;-src } }()
464</pre>
465<p>
466needs no semicolons.
467Idiomatic Go programs have semicolons only in places such as
468<code>for</code> loop clauses, to separate the initializer, condition, and
469continuation elements. They are also necessary to separate multiple
470statements on a line, should you write code that way.
471</p>
472
473<p>
474One consequence of the semicolon insertion rules
475is that you cannot put the opening brace of a
476control structure (<code>if</code>, <code>for</code>, <code>switch</code>,
477or <code>select</code>) on the next line. If you do, a semicolon
478will be inserted before the brace, which could cause unwanted
479effects. Write them like this
480</p>
481
482<pre>
483if i &lt; f() {
484 g()
485}
486</pre>
487<p>
488not like this
489</p>
490<pre>
491if i &lt; f() // wrong!
492{ // wrong!
493 g()
494}
495</pre>
496
497
498<h2 id="control-structures">Control structures</h2>
499
500<p>
501The control structures of Go are related to those of C but differ
502in important ways.
503There is no <code>do</code> or <code>while</code> loop, only a
504slightly generalized
505<code>for</code>;
506<code>switch</code> is more flexible;
507<code>if</code> and <code>switch</code> accept an optional
508initialization statement like that of <code>for</code>;
509<code>break</code> and <code>continue</code> statements
510take an optional label to identify what to break or continue;
511and there are new control structures including a type switch and a
512multiway communications multiplexer, <code>select</code>.
513The syntax is also slightly different:
514there are no parentheses
515and the bodies must always be brace-delimited.
516</p>
517
518<h3 id="if">If</h3>
519
520<p>
521In Go a simple <code>if</code> looks like this:
522</p>
523<pre>
524if x &gt; 0 {
525 return y
526}
527</pre>
528
529<p>
530Mandatory braces encourage writing simple <code>if</code> statements
531on multiple lines. It's good style to do so anyway,
532especially when the body contains a control statement such as a
533<code>return</code> or <code>break</code>.
534</p>
535
536<p>
537Since <code>if</code> and <code>switch</code> accept an initialization
538statement, it's common to see one used to set up a local variable.
539</p>
540
541<pre>
542if err := file.Chmod(0664); err != nil {
543 log.Print(err)
544 return err
545}
546</pre>
547
548<p id="else">
549In the Go libraries, you'll find that
550when an <code>if</code> statement doesn't flow into the next statement—that is,
551the body ends in <code>break</code>, <code>continue</code>,
552<code>goto</code>, or <code>return</code>—the unnecessary
553<code>else</code> is omitted.
554</p>
555
556<pre>
557f, err := os.Open(name)
558if err != nil {
559 return err
560}
561codeUsing(f)
562</pre>
563
564<p>
565This is an example of a common situation where code must guard against a
566sequence of error conditions. The code reads well if the
567successful flow of control runs down the page, eliminating error cases
568as they arise. Since error cases tend to end in <code>return</code>
569statements, the resulting code needs no <code>else</code> statements.
570</p>
571
572<pre>
573f, err := os.Open(name)
574if err != nil {
575 return err
576}
577d, err := f.Stat()
578if err != nil {
579 f.Close()
580 return err
581}
582codeUsing(f, d)
583</pre>
584
585
586<h3 id="redeclaration">Redeclaration and reassignment</h3>
587
588<p>
589An aside: The last example in the previous section demonstrates a detail of how the
590<code>:=</code> short declaration form works.
591The declaration that calls <code>os.Open</code> reads,
592</p>
593
594<pre>
595f, err := os.Open(name)
596</pre>
597
598<p>
599This statement declares two variables, <code>f</code> and <code>err</code>.
600A few lines later, the call to <code>f.Stat</code> reads,
601</p>
602
603<pre>
604d, err := f.Stat()
605</pre>
606
607<p>
608which looks as if it declares <code>d</code> and <code>err</code>.
609Notice, though, that <code>err</code> appears in both statements.
610This duplication is legal: <code>err</code> is declared by the first statement,
611but only <em>re-assigned</em> in the second.
612This means that the call to <code>f.Stat</code> uses the existing
613<code>err</code> variable declared above, and just gives it a new value.
614</p>
615
616<p>
617In a <code>:=</code> declaration a variable <code>v</code> may appear even
618if it has already been declared, provided:
619</p>
620
621<ul>
622<li>this declaration is in the same scope as the existing declaration of <code>v</code>
623(if <code>v</code> is already declared in an outer scope, the declaration will create a new variable §),</li>
624<li>the corresponding value in the initialization is assignable to <code>v</code>, and</li>
625<li>there is at least one other variable in the declaration that is being declared anew.</li>
626</ul>
627
628<p>
629This unusual property is pure pragmatism,
630making it easy to use a single <code>err</code> value, for example,
631in a long <code>if-else</code> chain.
632You'll see it used often.
633</p>
634
635<p>
636§ It's worth noting here that in Go the scope of function parameters and return values
637is the same as the function body, even though they appear lexically outside the braces
638that enclose the body.
639</p>
640
641<h3 id="for">For</h3>
642
643<p>
644The Go <code>for</code> loop is similar to&mdash;but not the same as&mdash;C's.
645It unifies <code>for</code>
646and <code>while</code> and there is no <code>do-while</code>.
647There are three forms, only one of which has semicolons.
648</p>
649<pre>
650// Like a C for
651for init; condition; post { }
652
653// Like a C while
654for condition { }
655
656// Like a C for(;;)
657for { }
658</pre>
659
660<p>
661Short declarations make it easy to declare the index variable right in the loop.
662</p>
663<pre>
664sum := 0
665for i := 0; i &lt; 10; i++ {
666 sum += i
667}
668</pre>
669
670<p>
671If you're looping over an array, slice, string, or map,
672or reading from a channel, a <code>range</code> clause can
673manage the loop.
674</p>
675<pre>
676for key, value := range oldMap {
677 newMap[key] = value
678}
679</pre>
680
681<p>
682If you only need the first item in the range (the key or index), drop the second:
683</p>
684<pre>
685for key := range m {
686 if key.expired() {
687 delete(m, key)
688 }
689}
690</pre>
691
692<p>
693If you only need the second item in the range (the value), use the <em>blank identifier</em>, an underscore, to discard the first:
694</p>
695<pre>
696sum := 0
697for _, value := range array {
698 sum += value
699}
700</pre>
701
702<p>
703The blank identifier has many uses, as described in <a href="#blank">a later section</a>.
704</p>
705
706<p>
707For strings, the <code>range</code> does more work for you, breaking out individual
708Unicode code points by parsing the UTF-8.
709Erroneous encodings consume one byte and produce the
710replacement rune U+FFFD.
711(The name (with associated builtin type) <code>rune</code> is Go terminology for a
712single Unicode code point.
713See <a href="/ref/spec#Rune_literals">the language specification</a>
714for details.)
715The loop
716</p>
717<pre>
718for pos, char := range "日本\x80語" { // \x80 is an illegal UTF-8 encoding
719 fmt.Printf("character %#U starts at byte position %d\n", char, pos)
720}
721</pre>
722<p>
723prints
724</p>
725<pre>
726character U+65E5 '日' starts at byte position 0
727character U+672C '本' starts at byte position 3
728character U+FFFD '�' starts at byte position 6
729character U+8A9E '語' starts at byte position 7
730</pre>
731
732<p>
733Finally, Go has no comma operator and <code>++</code> and <code>--</code>
734are statements not expressions.
735Thus if you want to run multiple variables in a <code>for</code>
736you should use parallel assignment (although that precludes <code>++</code> and <code>--</code>).
737</p>
738<pre>
739// Reverse a
740for i, j := 0, len(a)-1; i &lt; j; i, j = i+1, j-1 {
741 a[i], a[j] = a[j], a[i]
742}
743</pre>
744
745<h3 id="switch">Switch</h3>
746
747<p>
748Go's <code>switch</code> is more general than C's.
749The expressions need not be constants or even integers,
750the cases are evaluated top to bottom until a match is found,
751and if the <code>switch</code> has no expression it switches on
752<code>true</code>.
753It's therefore possible&mdash;and idiomatic&mdash;to write an
754<code>if</code>-<code>else</code>-<code>if</code>-<code>else</code>
755chain as a <code>switch</code>.
756</p>
757
758<pre>
759func unhex(c byte) byte {
760 switch {
761 case '0' &lt;= c &amp;&amp; c &lt;= '9':
762 return c - '0'
763 case 'a' &lt;= c &amp;&amp; c &lt;= 'f':
764 return c - 'a' + 10
765 case 'A' &lt;= c &amp;&amp; c &lt;= 'F':
766 return c - 'A' + 10
767 }
768 return 0
769}
770</pre>
771
772<p>
773There is no automatic fall through, but cases can be presented
774in comma-separated lists.
775</p>
776<pre>
777func shouldEscape(c byte) bool {
778 switch c {
779 case ' ', '?', '&amp;', '=', '#', '+', '%':
780 return true
781 }
782 return false
783}
784</pre>
785
786<p>
787Although they are not nearly as common in Go as some other C-like
788languages, <code>break</code> statements can be used to terminate
789a <code>switch</code> early.
790Sometimes, though, it's necessary to break out of a surrounding loop,
791not the switch, and in Go that can be accomplished by putting a label
792on the loop and "breaking" to that label.
793This example shows both uses.
794</p>
795
796<pre>
797Loop:
798 for n := 0; n &lt; len(src); n += size {
799 switch {
800 case src[n] &lt; sizeOne:
801 if validateOnly {
802 break
803 }
804 size = 1
805 update(src[n])
806
807 case src[n] &lt; sizeTwo:
808 if n+1 &gt;= len(src) {
809 err = errShortInput
810 break Loop
811 }
812 if validateOnly {
813 break
814 }
815 size = 2
816 update(src[n] + src[n+1]&lt;&lt;shift)
817 }
818 }
819</pre>
820
821<p>
822Of course, the <code>continue</code> statement also accepts an optional label
823but it applies only to loops.
824</p>
825
826<p>
827To close this section, here's a comparison routine for byte slices that uses two
828<code>switch</code> statements:
829</p>
830<pre>
831// Compare returns an integer comparing the two byte slices,
832// lexicographically.
833// The result will be 0 if a == b, -1 if a &lt; b, and +1 if a &gt; b
834func Compare(a, b []byte) int {
835 for i := 0; i &lt; len(a) &amp;&amp; i &lt; len(b); i++ {
836 switch {
837 case a[i] &gt; b[i]:
838 return 1
839 case a[i] &lt; b[i]:
840 return -1
841 }
842 }
843 switch {
844 case len(a) &gt; len(b):
845 return 1
846 case len(a) &lt; len(b):
847 return -1
848 }
849 return 0
850}
851</pre>
852
853<h3 id="type_switch">Type switch</h3>
854
855<p>
856A switch can also be used to discover the dynamic type of an interface
857variable. Such a <em>type switch</em> uses the syntax of a type
858assertion with the keyword <code>type</code> inside the parentheses.
859If the switch declares a variable in the expression, the variable will
860have the corresponding type in each clause.
861It's also idiomatic to reuse the name in such cases, in effect declaring
862a new variable with the same name but a different type in each case.
863</p>
864<pre>
865var t interface{}
866t = functionOfSomeType()
867switch t := t.(type) {
868default:
869 fmt.Printf("unexpected type %T", t) // %T prints whatever type t has
870case bool:
871 fmt.Printf("boolean %t\n", t) // t has type bool
872case int:
873 fmt.Printf("integer %d\n", t) // t has type int
874case *bool:
875 fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
876case *int:
877 fmt.Printf("pointer to integer %d\n", *t) // t has type *int
878}
879</pre>
880
881<h2 id="functions">Functions</h2>
882
883<h3 id="multiple-returns">Multiple return values</h3>
884
885<p>
886One of Go's unusual features is that functions and methods
887can return multiple values. This form can be used to
888improve on a couple of clumsy idioms in C programs: in-band
889error returns such as <code>-1</code> for <code>EOF</code>
890and modifying an argument passed by address.
891</p>
892
893<p>
894In C, a write error is signaled by a negative count with the
895error code secreted away in a volatile location.
896In Go, <code>Write</code>
897can return a count <i>and</i> an error: &ldquo;Yes, you wrote some
898bytes but not all of them because you filled the device&rdquo;.
899The signature of the <code>Write</code> method on files from
900package <code>os</code> is:
901</p>
902
903<pre>
904func (file *File) Write(b []byte) (n int, err error)
905</pre>
906
907<p>
908and as the documentation says, it returns the number of bytes
909written and a non-nil <code>error</code> when <code>n</code>
910<code>!=</code> <code>len(b)</code>.
911This is a common style; see the section on error handling for more examples.
912</p>
913
914<p>
915A similar approach obviates the need to pass a pointer to a return
916value to simulate a reference parameter.
917Here's a simple-minded function to
918grab a number from a position in a byte slice, returning the number
919and the next position.
920</p>
921
922<pre>
923func nextInt(b []byte, i int) (int, int) {
924 for ; i &lt; len(b) &amp;&amp; !isDigit(b[i]); i++ {
925 }
926 x := 0
927 for ; i &lt; len(b) &amp;&amp; isDigit(b[i]); i++ {
928 x = x*10 + int(b[i]) - '0'
929 }
930 return x, i
931}
932</pre>
933
934<p>
935You could use it to scan the numbers in an input slice <code>b</code> like this:
936</p>
937
938<pre>
939 for i := 0; i &lt; len(b); {
940 x, i = nextInt(b, i)
941 fmt.Println(x)
942 }
943</pre>
944
945<h3 id="named-results">Named result parameters</h3>
946
947<p>
948The return or result "parameters" of a Go function can be given names and
949used as regular variables, just like the incoming parameters.
950When named, they are initialized to the zero values for their types when
951the function begins; if the function executes a <code>return</code> statement
952with no arguments, the current values of the result parameters are
953used as the returned values.
954</p>
955
956<p>
957The names are not mandatory but they can make code shorter and clearer:
958they're documentation.
959If we name the results of <code>nextInt</code> it becomes
960obvious which returned <code>int</code>
961is which.
962</p>
963
964<pre>
965func nextInt(b []byte, pos int) (value, nextPos int) {
966</pre>
967
968<p>
969Because named results are initialized and tied to an unadorned return, they can simplify
970as well as clarify. Here's a version
971of <code>io.ReadFull</code> that uses them well:
972</p>
973
974<pre>
975func ReadFull(r Reader, buf []byte) (n int, err error) {
976 for len(buf) &gt; 0 &amp;&amp; err == nil {
977 var nr int
978 nr, err = r.Read(buf)
979 n += nr
980 buf = buf[nr:]
981 }
982 return
983}
984</pre>
985
986<h3 id="defer">Defer</h3>
987
988<p>
989Go's <code>defer</code> statement schedules a function call (the
990<i>deferred</i> function) to be run immediately before the function
991executing the <code>defer</code> returns. It's an unusual but
992effective way to deal with situations such as resources that must be
993released regardless of which path a function takes to return. The
994canonical examples are unlocking a mutex or closing a file.
995</p>
996
997<pre>
998// Contents returns the file's contents as a string.
999func Contents(filename string) (string, error) {
1000 f, err := os.Open(filename)
1001 if err != nil {
1002 return "", err
1003 }
1004 defer f.Close() // f.Close will run when we're finished.
1005
1006 var result []byte
1007 buf := make([]byte, 100)
1008 for {
1009 n, err := f.Read(buf[0:])
1010 result = append(result, buf[0:n]...) // append is discussed later.
1011 if err != nil {
1012 if err == io.EOF {
1013 break
1014 }
1015 return "", err // f will be closed if we return here.
1016 }
1017 }
1018 return string(result), nil // f will be closed if we return here.
1019}
1020</pre>
1021
1022<p>
1023Deferring a call to a function such as <code>Close</code> has two advantages. First, it
1024guarantees that you will never forget to close the file, a mistake
1025that's easy to make if you later edit the function to add a new return
1026path. Second, it means that the close sits near the open,
1027which is much clearer than placing it at the end of the function.
1028</p>
1029
1030<p>
1031The arguments to the deferred function (which include the receiver if
1032the function is a method) are evaluated when the <i>defer</i>
1033executes, not when the <i>call</i> executes. Besides avoiding worries
1034about variables changing values as the function executes, this means
1035that a single deferred call site can defer multiple function
1036executions. Here's a silly example.
1037</p>
1038
1039<pre>
1040for i := 0; i &lt; 5; i++ {
1041 defer fmt.Printf("%d ", i)
1042}
1043</pre>
1044
1045<p>
1046Deferred functions are executed in LIFO order, so this code will cause
1047<code>4 3 2 1 0</code> to be printed when the function returns. A
1048more plausible example is a simple way to trace function execution
1049through the program. We could write a couple of simple tracing
1050routines like this:
1051</p>
1052
1053<pre>
1054func trace(s string) { fmt.Println("entering:", s) }
1055func untrace(s string) { fmt.Println("leaving:", s) }
1056
1057// Use them like this:
1058func a() {
1059 trace("a")
1060 defer untrace("a")
1061 // do something....
1062}
1063</pre>
1064
1065<p>
1066We can do better by exploiting the fact that arguments to deferred
1067functions are evaluated when the <code>defer</code> executes. The
1068tracing routine can set up the argument to the untracing routine.
1069This example:
1070</p>
1071
1072<pre>
1073func trace(s string) string {
1074 fmt.Println("entering:", s)
1075 return s
1076}
1077
1078func un(s string) {
1079 fmt.Println("leaving:", s)
1080}
1081
1082func a() {
1083 defer un(trace("a"))
1084 fmt.Println("in a")
1085}
1086
1087func b() {
1088 defer un(trace("b"))
1089 fmt.Println("in b")
1090 a()
1091}
1092
1093func main() {
1094 b()
1095}
1096</pre>
1097
1098<p>
1099prints
1100</p>
1101
1102<pre>
1103entering: b
1104in b
1105entering: a
1106in a
1107leaving: a
1108leaving: b
1109</pre>
1110
1111<p>
1112For programmers accustomed to block-level resource management from
1113other languages, <code>defer</code> may seem peculiar, but its most
1114interesting and powerful applications come precisely from the fact
1115that it's not block-based but function-based. In the section on
1116<code>panic</code> and <code>recover</code> we'll see another
1117example of its possibilities.
1118</p>
1119
1120<h2 id="data">Data</h2>
1121
1122<h3 id="allocation_new">Allocation with <code>new</code></h3>
1123
1124<p>
1125Go has two allocation primitives, the built-in functions
1126<code>new</code> and <code>make</code>.
1127They do different things and apply to different types, which can be confusing,
1128but the rules are simple.
1129Let's talk about <code>new</code> first.
1130It's a built-in function that allocates memory, but unlike its namesakes
1131in some other languages it does not <em>initialize</em> the memory,
1132it only <em>zeros</em> it.
1133That is,
1134<code>new(T)</code> allocates zeroed storage for a new item of type
1135<code>T</code> and returns its address, a value of type <code>*T</code>.
1136In Go terminology, it returns a pointer to a newly allocated zero value of type
1137<code>T</code>.
1138</p>
1139
1140<p>
1141Since the memory returned by <code>new</code> is zeroed, it's helpful to arrange
1142when designing your data structures that the
1143zero value of each type can be used without further initialization. This means a user of
1144the data structure can create one with <code>new</code> and get right to
1145work.
1146For example, the documentation for <code>bytes.Buffer</code> states that
1147"the zero value for <code>Buffer</code> is an empty buffer ready to use."
1148Similarly, <code>sync.Mutex</code> does not
1149have an explicit constructor or <code>Init</code> method.
1150Instead, the zero value for a <code>sync.Mutex</code>
1151is defined to be an unlocked mutex.
1152</p>
1153
1154<p>
1155The zero-value-is-useful property works transitively. Consider this type declaration.
1156</p>
1157
1158<pre>
1159type SyncedBuffer struct {
1160 lock sync.Mutex
1161 buffer bytes.Buffer
1162}
1163</pre>
1164
1165<p>
1166Values of type <code>SyncedBuffer</code> are also ready to use immediately upon allocation
1167or just declaration. In the next snippet, both <code>p</code> and <code>v</code> will work
1168correctly without further arrangement.
1169</p>
1170
1171<pre>
1172p := new(SyncedBuffer) // type *SyncedBuffer
1173var v SyncedBuffer // type SyncedBuffer
1174</pre>
1175
1176<h3 id="composite_literals">Constructors and composite literals</h3>
1177
1178<p>
1179Sometimes the zero value isn't good enough and an initializing
1180constructor is necessary, as in this example derived from
1181package <code>os</code>.
1182</p>
1183
1184<pre>
1185func NewFile(fd int, name string) *File {
1186 if fd &lt; 0 {
1187 return nil
1188 }
1189 f := new(File)
1190 f.fd = fd
1191 f.name = name
1192 f.dirinfo = nil
1193 f.nepipe = 0
1194 return f
1195}
1196</pre>
1197
1198<p>
1199There's a lot of boiler plate in there. We can simplify it
1200using a <i>composite literal</i>, which is
1201an expression that creates a
1202new instance each time it is evaluated.
1203</p>
1204
1205<pre>
1206func NewFile(fd int, name string) *File {
1207 if fd &lt; 0 {
1208 return nil
1209 }
1210 f := File{fd, name, nil, 0}
1211 return &amp;f
1212}
1213</pre>
1214
1215<p>
1216Note that, unlike in C, it's perfectly OK to return the address of a local variable;
1217the storage associated with the variable survives after the function
1218returns.
1219In fact, taking the address of a composite literal
1220allocates a fresh instance each time it is evaluated,
1221so we can combine these last two lines.
1222</p>
1223
1224<pre>
1225 return &amp;File{fd, name, nil, 0}
1226</pre>
1227
1228<p>
1229The fields of a composite literal are laid out in order and must all be present.
1230However, by labeling the elements explicitly as <i>field</i><code>:</code><i>value</i>
1231pairs, the initializers can appear in any
1232order, with the missing ones left as their respective zero values. Thus we could say
1233</p>
1234
1235<pre>
1236 return &amp;File{fd: fd, name: name}
1237</pre>
1238
1239<p>
1240As a limiting case, if a composite literal contains no fields at all, it creates
1241a zero value for the type. The expressions <code>new(File)</code> and <code>&amp;File{}</code> are equivalent.
1242</p>
1243
1244<p>
1245Composite literals can also be created for arrays, slices, and maps,
1246with the field labels being indices or map keys as appropriate.
1247In these examples, the initializations work regardless of the values of <code>Enone</code>,
1248<code>Eio</code>, and <code>Einval</code>, as long as they are distinct.
1249</p>
1250
1251<pre>
1252a := [...]string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
1253s := []string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
1254m := map[int]string{Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
1255</pre>
1256
1257<h3 id="allocation_make">Allocation with <code>make</code></h3>
1258
1259<p>
1260Back to allocation.
1261The built-in function <code>make(T, </code><i>args</i><code>)</code> serves
1262a purpose different from <code>new(T)</code>.
1263It creates slices, maps, and channels only, and it returns an <em>initialized</em>
1264(not <em>zeroed</em>)
1265value of type <code>T</code> (not <code>*T</code>).
1266The reason for the distinction
1267is that these three types represent, under the covers, references to data structures that
1268must be initialized before use.
1269A slice, for example, is a three-item descriptor
1270containing a pointer to the data (inside an array), the length, and the
1271capacity, and until those items are initialized, the slice is <code>nil</code>.
1272For slices, maps, and channels,
1273<code>make</code> initializes the internal data structure and prepares
1274the value for use.
1275For instance,
1276</p>
1277
1278<pre>
1279make([]int, 10, 100)
1280</pre>
1281
1282<p>
1283allocates an array of 100 ints and then creates a slice
1284structure with length 10 and a capacity of 100 pointing at the first
128510 elements of the array.
1286(When making a slice, the capacity can be omitted; see the section on slices
1287for more information.)
1288In contrast, <code>new([]int)</code> returns a pointer to a newly allocated, zeroed slice
1289structure, that is, a pointer to a <code>nil</code> slice value.
1290</p>
1291
1292<p>
1293These examples illustrate the difference between <code>new</code> and
1294<code>make</code>.
1295</p>
1296
1297<pre>
1298var p *[]int = new([]int) // allocates slice structure; *p == nil; rarely useful
1299var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
1300
1301// Unnecessarily complex:
1302var p *[]int = new([]int)
1303*p = make([]int, 100, 100)
1304
1305// Idiomatic:
1306v := make([]int, 100)
1307</pre>
1308
1309<p>
1310Remember that <code>make</code> applies only to maps, slices and channels
1311and does not return a pointer.
1312To obtain an explicit pointer allocate with <code>new</code> or take the address
1313of a variable explicitly.
1314</p>
1315
1316<h3 id="arrays">Arrays</h3>
1317
1318<p>
1319Arrays are useful when planning the detailed layout of memory and sometimes
1320can help avoid allocation, but primarily
1321they are a building block for slices, the subject of the next section.
1322To lay the foundation for that topic, here are a few words about arrays.
1323</p>
1324
1325<p>
1326There are major differences between the ways arrays work in Go and C.
1327In Go,
1328</p>
1329<ul>
1330<li>
1331Arrays are values. Assigning one array to another copies all the elements.
1332</li>
1333<li>
1334In particular, if you pass an array to a function, it
1335will receive a <i>copy</i> of the array, not a pointer to it.
1336<li>
1337The size of an array is part of its type. The types <code>[10]int</code>
1338and <code>[20]int</code> are distinct.
1339</li>
1340</ul>
1341
1342<p>
1343The value property can be useful but also expensive; if you want C-like behavior and efficiency,
1344you can pass a pointer to the array.
1345</p>
1346
1347<pre>
1348func Sum(a *[3]float64) (sum float64) {
1349 for _, v := range *a {
1350 sum += v
1351 }
1352 return
1353}
1354
1355array := [...]float64{7.0, 8.5, 9.1}
1356x := Sum(&amp;array) // Note the explicit address-of operator
1357</pre>
1358
1359<p>
1360But even this style isn't idiomatic Go.
1361Use slices instead.
1362</p>
1363
1364<h3 id="slices">Slices</h3>
1365
1366<p>
1367Slices wrap arrays to give a more general, powerful, and convenient
1368interface to sequences of data. Except for items with explicit
1369dimension such as transformation matrices, most array programming in
1370Go is done with slices rather than simple arrays.
1371</p>
1372<p>
1373Slices hold references to an underlying array, and if you assign one
1374slice to another, both refer to the same array.
1375If a function takes a slice argument, changes it makes to
1376the elements of the slice will be visible to the caller, analogous to
1377passing a pointer to the underlying array. A <code>Read</code>
1378function can therefore accept a slice argument rather than a pointer
1379and a count; the length within the slice sets an upper
1380limit of how much data to read. Here is the signature of the
1381<code>Read</code> method of the <code>File</code> type in package
1382<code>os</code>:
1383</p>
1384<pre>
1385func (file *File) Read(buf []byte) (n int, err error)
1386</pre>
1387<p>
1388The method returns the number of bytes read and an error value, if
1389any.
1390To read into the first 32 bytes of a larger buffer
1391<code>buf</code>, <i>slice</i> (here used as a verb) the buffer.
1392</p>
1393<pre>
1394 n, err := f.Read(buf[0:32])
1395</pre>
1396<p>
1397Such slicing is common and efficient. In fact, leaving efficiency aside for
1398the moment, the following snippet would also read the first 32 bytes of the buffer.
1399</p>
1400<pre>
1401 var n int
1402 var err error
1403 for i := 0; i &lt; 32; i++ {
1404 nbytes, e := f.Read(buf[i:i+1]) // Read one byte.
1405 if nbytes == 0 || e != nil {
1406 err = e
1407 break
1408 }
1409 n += nbytes
1410 }
1411</pre>
1412<p>
1413The length of a slice may be changed as long as it still fits within
1414the limits of the underlying array; just assign it to a slice of
1415itself. The <i>capacity</i> of a slice, accessible by the built-in
1416function <code>cap</code>, reports the maximum length the slice may
1417assume. Here is a function to append data to a slice. If the data
1418exceeds the capacity, the slice is reallocated. The
1419resulting slice is returned. The function uses the fact that
1420<code>len</code> and <code>cap</code> are legal when applied to the
1421<code>nil</code> slice, and return 0.
1422</p>
1423<pre>
1424func Append(slice, data[]byte) []byte {
1425 l := len(slice)
1426 if l + len(data) &gt; cap(slice) { // reallocate
1427 // Allocate double what's needed, for future growth.
1428 newSlice := make([]byte, (l+len(data))*2)
1429 // The copy function is predeclared and works for any slice type.
1430 copy(newSlice, slice)
1431 slice = newSlice
1432 }
1433 slice = slice[0:l+len(data)]
1434 for i, c := range data {
1435 slice[l+i] = c
1436 }
1437 return slice
1438}
1439</pre>
1440<p>
1441We must return the slice afterwards because, although <code>Append</code>
1442can modify the elements of <code>slice</code>, the slice itself (the run-time data
1443structure holding the pointer, length, and capacity) is passed by value.
1444</p>
1445
1446<p>
1447The idea of appending to a slice is so useful it's captured by the
1448<code>append</code> built-in function. To understand that function's
1449design, though, we need a little more information, so we'll return
1450to it later.
1451</p>
1452
1453<h3 id="two_dimensional_slices">Two-dimensional slices</h3>
1454
1455<p>
1456Go's arrays and slices are one-dimensional.
1457To create the equivalent of a 2D array or slice, it is necessary to define an array-of-arrays
1458or slice-of-slices, like this:
1459</p>
1460
1461<pre>
1462type Transform [3][3]float64 // A 3x3 array, really an array of arrays.
1463type LinesOfText [][]byte // A slice of byte slices.
1464</pre>
1465
1466<p>
1467Because slices are variable-length, it is possible to have each inner
1468slice be a different length.
1469That can be a common situation, as in our <code>LinesOfText</code>
1470example: each line has an independent length.
1471</p>
1472
1473<pre>
1474text := LinesOfText{
1475 []byte("Now is the time"),
1476 []byte("for all good gophers"),
1477 []byte("to bring some fun to the party."),
1478}
1479</pre>
1480
1481<p>
1482Sometimes it's necessary to allocate a 2D slice, a situation that can arise when
1483processing scan lines of pixels, for instance.
1484There are two ways to achieve this.
1485One is to allocate each slice independently; the other
1486is to allocate a single array and point the individual slices into it.
1487Which to use depends on your application.
1488If the slices might grow or shrink, they should be allocated independently
1489to avoid overwriting the next line; if not, it can be more efficient to construct
1490the object with a single allocation.
1491For reference, here are sketches of the two methods.
1492First, a line at a time:
1493</p>
1494
1495<pre>
1496// Allocate the top-level slice.
1497picture := make([][]uint8, YSize) // One row per unit of y.
1498// Loop over the rows, allocating the slice for each row.
1499for i := range picture {
1500 picture[i] = make([]uint8, XSize)
1501}
1502</pre>
1503
1504<p>
1505And now as one allocation, sliced into lines:
1506</p>
1507
1508<pre>
1509// Allocate the top-level slice, the same as before.
1510picture := make([][]uint8, YSize) // One row per unit of y.
1511// Allocate one large slice to hold all the pixels.
1512pixels := make([]uint8, XSize*YSize) // Has type []uint8 even though picture is [][]uint8.
1513// Loop over the rows, slicing each row from the front of the remaining pixels slice.
1514for i := range picture {
1515 picture[i], pixels = pixels[:XSize], pixels[XSize:]
1516}
1517</pre>
1518
1519<h3 id="maps">Maps</h3>
1520
1521<p>
1522Maps are a convenient and powerful built-in data structure that associate
1523values of one type (the <em>key</em>) with values of another type
1524(the <em>element</em> or <em>value</em>)
1525The key can be of any type for which the equality operator is defined,
1526such as integers,
1527floating point and complex numbers,
1528strings, pointers, interfaces (as long as the dynamic type
1529supports equality), structs and arrays.
1530Slices cannot be used as map keys,
1531because equality is not defined on them.
1532Like slices, maps hold references to an underlying data structure.
1533If you pass a map to a function
1534that changes the contents of the map, the changes will be visible
1535in the caller.
1536</p>
1537<p>
1538Maps can be constructed using the usual composite literal syntax
1539with colon-separated key-value pairs,
1540so it's easy to build them during initialization.
1541</p>
1542<pre>
1543var timeZone = map[string]int{
1544 "UTC": 0*60*60,
1545 "EST": -5*60*60,
1546 "CST": -6*60*60,
1547 "MST": -7*60*60,
1548 "PST": -8*60*60,
1549}
1550</pre>
1551<p>
1552Assigning and fetching map values looks syntactically just like
1553doing the same for arrays and slices except that the index doesn't
1554need to be an integer.
1555</p>
1556<pre>
1557offset := timeZone["EST"]
1558</pre>
1559<p>
1560An attempt to fetch a map value with a key that
1561is not present in the map will return the zero value for the type
1562of the entries
1563in the map. For instance, if the map contains integers, looking
1564up a non-existent key will return <code>0</code>.
1565A set can be implemented as a map with value type <code>bool</code>.
1566Set the map entry to <code>true</code> to put the value in the set, and then
1567test it by simple indexing.
1568</p>
1569<pre>
1570attended := map[string]bool{
1571 "Ann": true,
1572 "Joe": true,
1573 ...
1574}
1575
1576if attended[person] { // will be false if person is not in the map
1577 fmt.Println(person, "was at the meeting")
1578}
1579</pre>
1580<p>
1581Sometimes you need to distinguish a missing entry from
1582a zero value. Is there an entry for <code>"UTC"</code>
1583or is that the empty string because it's not in the map at all?
1584You can discriminate with a form of multiple assignment.
1585</p>
1586<pre>
1587var seconds int
1588var ok bool
1589seconds, ok = timeZone[tz]
1590</pre>
1591<p>
1592For obvious reasons this is called the &ldquo;comma ok&rdquo; idiom.
1593In this example, if <code>tz</code> is present, <code>seconds</code>
1594will be set appropriately and <code>ok</code> will be true; if not,
1595<code>seconds</code> will be set to zero and <code>ok</code> will
1596be false.
1597Here's a function that puts it together with a nice error report:
1598</p>
1599<pre>
1600func offset(tz string) int {
1601 if seconds, ok := timeZone[tz]; ok {
1602 return seconds
1603 }
1604 log.Println("unknown time zone:", tz)
1605 return 0
1606}
1607</pre>
1608<p>
1609To test for presence in the map without worrying about the actual value,
1610you can use the <a href="#blank">blank identifier</a> (<code>_</code>)
1611in place of the usual variable for the value.
1612</p>
1613<pre>
1614_, present := timeZone[tz]
1615</pre>
1616<p>
1617To delete a map entry, use the <code>delete</code>
1618built-in function, whose arguments are the map and the key to be deleted.
1619It's safe to do this even if the key is already absent
1620from the map.
1621</p>
1622<pre>
1623delete(timeZone, "PDT") // Now on Standard Time
1624</pre>
1625
1626<h3 id="printing">Printing</h3>
1627
1628<p>
1629Formatted printing in Go uses a style similar to C's <code>printf</code>
1630family but is richer and more general. The functions live in the <code>fmt</code>
1631package and have capitalized names: <code>fmt.Printf</code>, <code>fmt.Fprintf</code>,
1632<code>fmt.Sprintf</code> and so on. The string functions (<code>Sprintf</code> etc.)
1633return a string rather than filling in a provided buffer.
1634</p>
1635<p>
1636You don't need to provide a format string. For each of <code>Printf</code>,
1637<code>Fprintf</code> and <code>Sprintf</code> there is another pair
1638of functions, for instance <code>Print</code> and <code>Println</code>.
1639These functions do not take a format string but instead generate a default
1640format for each argument. The <code>Println</code> versions also insert a blank
1641between arguments and append a newline to the output while
1642the <code>Print</code> versions add blanks only if the operand on neither side is a string.
1643In this example each line produces the same output.
1644</p>
1645<pre>
1646fmt.Printf("Hello %d\n", 23)
1647fmt.Fprint(os.Stdout, "Hello ", 23, "\n")
1648fmt.Println("Hello", 23)
1649fmt.Println(fmt.Sprint("Hello ", 23))
1650</pre>
1651<p>
1652The formatted print functions <code>fmt.Fprint</code>
1653and friends take as a first argument any object
1654that implements the <code>io.Writer</code> interface; the variables <code>os.Stdout</code>
1655and <code>os.Stderr</code> are familiar instances.
1656</p>
1657<p>
1658Here things start to diverge from C. First, the numeric formats such as <code>%d</code>
1659do not take flags for signedness or size; instead, the printing routines use the
1660type of the argument to decide these properties.
1661</p>
1662<pre>
1663var x uint64 = 1&lt;&lt;64 - 1
1664fmt.Printf("%d %x; %d %x\n", x, x, int64(x), int64(x))
1665</pre>
1666<p>
1667prints
1668</p>
1669<pre>
167018446744073709551615 ffffffffffffffff; -1 -1
1671</pre>
1672<p>
1673If you just want the default conversion, such as decimal for integers, you can use
1674the catchall format <code>%v</code> (for &ldquo;value&rdquo;); the result is exactly
1675what <code>Print</code> and <code>Println</code> would produce.
1676Moreover, that format can print <em>any</em> value, even arrays, slices, structs, and
1677maps. Here is a print statement for the time zone map defined in the previous section.
1678</p>
1679<pre>
1680fmt.Printf("%v\n", timeZone) // or just fmt.Println(timeZone)
1681</pre>
1682<p>
1683which gives output
1684</p>
1685<pre>
1686map[CST:-21600 PST:-28800 EST:-18000 UTC:0 MST:-25200]
1687</pre>
1688<p>
1689For maps the keys may be output in any order, of course.
1690When printing a struct, the modified format <code>%+v</code> annotates the
1691fields of the structure with their names, and for any value the alternate
1692format <code>%#v</code> prints the value in full Go syntax.
1693</p>
1694<pre>
1695type T struct {
1696 a int
1697 b float64
1698 c string
1699}
1700t := &amp;T{ 7, -2.35, "abc\tdef" }
1701fmt.Printf("%v\n", t)
1702fmt.Printf("%+v\n", t)
1703fmt.Printf("%#v\n", t)
1704fmt.Printf("%#v\n", timeZone)
1705</pre>
1706<p>
1707prints
1708</p>
1709<pre>
1710&amp;{7 -2.35 abc def}
1711&amp;{a:7 b:-2.35 c:abc def}
1712&amp;main.T{a:7, b:-2.35, c:"abc\tdef"}
1713map[string] int{"CST":-21600, "PST":-28800, "EST":-18000, "UTC":0, "MST":-25200}
1714</pre>
1715<p>
1716(Note the ampersands.)
1717That quoted string format is also available through <code>%q</code> when
1718applied to a value of type <code>string</code> or <code>[]byte</code>.
1719The alternate format <code>%#q</code> will use backquotes instead if possible.
1720(The <code>%q</code> format also applies to integers and runes, producing a
1721single-quoted rune constant.)
1722Also, <code>%x</code> works on strings, byte arrays and byte slices as well as
1723on integers, generating a long hexadecimal string, and with
1724a space in the format (<code>%&nbsp;x</code>) it puts spaces between the bytes.
1725</p>
1726<p>
1727Another handy format is <code>%T</code>, which prints the <em>type</em> of a value.
1728</p>
1729<pre>
1730fmt.Printf(&quot;%T\n&quot;, timeZone)
1731</pre>
1732<p>
1733prints
1734</p>
1735<pre>
1736map[string] int
1737</pre>
1738<p>
1739If you want to control the default format for a custom type, all that's required is to define
1740a method with the signature <code>String() string</code> on the type.
1741For our simple type <code>T</code>, that might look like this.
1742</p>
1743<pre>
1744func (t *T) String() string {
1745 return fmt.Sprintf("%d/%g/%q", t.a, t.b, t.c)
1746}
1747fmt.Printf("%v\n", t)
1748</pre>
1749<p>
1750to print in the format
1751</p>
1752<pre>
17537/-2.35/"abc\tdef"
1754</pre>
1755<p>
1756(If you need to print <em>values</em> of type <code>T</code> as well as pointers to <code>T</code>,
1757the receiver for <code>String</code> must be of value type; this example used a pointer because
1758that's more efficient and idiomatic for struct types.
1759See the section below on <a href="#pointers_vs_values">pointers vs. value receivers</a> for more information.)
1760</p>
1761
1762<p>
1763Our <code>String</code> method is able to call <code>Sprintf</code> because the
1764print routines are fully reentrant and can be wrapped this way.
1765There is one important detail to understand about this approach,
1766however: don't construct a <code>String</code> method by calling
1767<code>Sprintf</code> in a way that will recur into your <code>String</code>
1768method indefinitely. This can happen if the <code>Sprintf</code>
1769call attempts to print the receiver directly as a string, which in
1770turn will invoke the method again. It's a common and easy mistake
1771to make, as this example shows.
1772</p>
1773
1774<pre>
1775type MyString string
1776
1777func (m MyString) String() string {
1778 return fmt.Sprintf("MyString=%s", m) // Error: will recur forever.
1779}
1780</pre>
1781
1782<p>
1783It's also easy to fix: convert the argument to the basic string type, which does not have the
1784method.
1785</p>
1786
1787<pre>
1788type MyString string
1789func (m MyString) String() string {
1790 return fmt.Sprintf("MyString=%s", string(m)) // OK: note conversion.
1791}
1792</pre>
1793
1794<p>
1795In the <a href="#initialization">initialization section</a> we'll see another technique that avoids this recursion.
1796</p>
1797
1798<p>
1799Another printing technique is to pass a print routine's arguments directly to another such routine.
1800The signature of <code>Printf</code> uses the type <code>...interface{}</code>
1801for its final argument to specify that an arbitrary number of parameters (of arbitrary type)
1802can appear after the format.
1803</p>
1804<pre>
1805func Printf(format string, v ...interface{}) (n int, err error) {
1806</pre>
1807<p>
1808Within the function <code>Printf</code>, <code>v</code> acts like a variable of type
1809<code>[]interface{}</code> but if it is passed to another variadic function, it acts like
1810a regular list of arguments.
1811Here is the implementation of the
1812function <code>log.Println</code> we used above. It passes its arguments directly to
1813<code>fmt.Sprintln</code> for the actual formatting.
1814</p>
1815<pre>
1816// Println prints to the standard logger in the manner of fmt.Println.
1817func Println(v ...interface{}) {
1818 std.Output(2, fmt.Sprintln(v...)) // Output takes parameters (int, string)
1819}
1820</pre>
1821<p>
1822We write <code>...</code> after <code>v</code> in the nested call to <code>Sprintln</code> to tell the
1823compiler to treat <code>v</code> as a list of arguments; otherwise it would just pass
1824<code>v</code> as a single slice argument.
1825</p>
1826<p>
1827There's even more to printing than we've covered here. See the <code>godoc</code> documentation
1828for package <code>fmt</code> for the details.
1829</p>
1830<p>
1831By the way, a <code>...</code> parameter can be of a specific type, for instance <code>...int</code>
1832for a min function that chooses the least of a list of integers:
1833</p>
1834<pre>
1835func Min(a ...int) int {
1836 min := int(^uint(0) >> 1) // largest int
1837 for _, i := range a {
1838 if i &lt; min {
1839 min = i
1840 }
1841 }
1842 return min
1843}
1844</pre>
1845
1846<h3 id="append">Append</h3>
1847<p>
1848Now we have the missing piece we needed to explain the design of
1849the <code>append</code> built-in function. The signature of <code>append</code>
1850is different from our custom <code>Append</code> function above.
1851Schematically, it's like this:
1852</p>
1853<pre>
1854func append(slice []<i>T</i>, elements ...<i>T</i>) []<i>T</i>
1855</pre>
1856<p>
1857where <i>T</i> is a placeholder for any given type. You can't
1858actually write a function in Go where the type <code>T</code>
1859is determined by the caller.
1860That's why <code>append</code> is built in: it needs support from the
1861compiler.
1862</p>
1863<p>
1864What <code>append</code> does is append the elements to the end of
1865the slice and return the result. The result needs to be returned
1866because, as with our hand-written <code>Append</code>, the underlying
1867array may change. This simple example
1868</p>
1869<pre>
1870x := []int{1,2,3}
1871x = append(x, 4, 5, 6)
1872fmt.Println(x)
1873</pre>
1874<p>
1875prints <code>[1 2 3 4 5 6]</code>. So <code>append</code> works a
1876little like <code>Printf</code>, collecting an arbitrary number of
1877arguments.
1878</p>
1879<p>
1880But what if we wanted to do what our <code>Append</code> does and
1881append a slice to a slice? Easy: use <code>...</code> at the call
1882site, just as we did in the call to <code>Output</code> above. This
1883snippet produces identical output to the one above.
1884</p>
1885<pre>
1886x := []int{1,2,3}
1887y := []int{4,5,6}
1888x = append(x, y...)
1889fmt.Println(x)
1890</pre>
1891<p>
1892Without that <code>...</code>, it wouldn't compile because the types
1893would be wrong; <code>y</code> is not of type <code>int</code>.
1894</p>
1895
1896<h2 id="initialization">Initialization</h2>
1897
1898<p>
1899Although it doesn't look superficially very different from
1900initialization in C or C++, initialization in Go is more powerful.
1901Complex structures can be built during initialization and the ordering
1902issues among initialized objects, even among different packages, are handled
1903correctly.
1904</p>
1905
1906<h3 id="constants">Constants</h3>
1907
1908<p>
1909Constants in Go are just that&mdash;constant.
1910They are created at compile time, even when defined as
1911locals in functions,
1912and can only be numbers, characters (runes), strings or booleans.
1913Because of the compile-time restriction, the expressions
1914that define them must be constant expressions,
1915evaluatable by the compiler. For instance,
1916<code>1&lt;&lt;3</code> is a constant expression, while
1917<code>math.Sin(math.Pi/4)</code> is not because
1918the function call to <code>math.Sin</code> needs
1919to happen at run time.
1920</p>
1921
1922<p>
1923In Go, enumerated constants are created using the <code>iota</code>
1924enumerator. Since <code>iota</code> can be part of an expression and
1925expressions can be implicitly repeated, it is easy to build intricate
1926sets of values.
1927</p>
1928{{code "/doc/progs/eff_bytesize.go" `/^type ByteSize/` `/^\)/`}}
1929<p>
1930The ability to attach a method such as <code>String</code> to any
1931user-defined type makes it possible for arbitrary values to format themselves
1932automatically for printing.
1933Although you'll see it most often applied to structs, this technique is also useful for
1934scalar types such as floating-point types like <code>ByteSize</code>.
1935</p>
1936{{code "/doc/progs/eff_bytesize.go" `/^func.*ByteSize.*String/` `/^}/`}}
1937<p>
1938The expression <code>YB</code> prints as <code>1.00YB</code>,
1939while <code>ByteSize(1e13)</code> prints as <code>9.09TB</code>.
1940</p>
1941
1942<p>
1943The use here of <code>Sprintf</code>
1944to implement <code>ByteSize</code>'s <code>String</code> method is safe
1945(avoids recurring indefinitely) not because of a conversion but
1946because it calls <code>Sprintf</code> with <code>%f</code>,
1947which is not a string format: <code>Sprintf</code> will only call
1948the <code>String</code> method when it wants a string, and <code>%f</code>
1949wants a floating-point value.
1950</p>
1951
1952<h3 id="variables">Variables</h3>
1953
1954<p>
1955Variables can be initialized just like constants but the
1956initializer can be a general expression computed at run time.
1957</p>
1958<pre>
1959var (
1960 home = os.Getenv("HOME")
1961 user = os.Getenv("USER")
1962 gopath = os.Getenv("GOPATH")
1963)
1964</pre>
1965
1966<h3 id="init">The init function</h3>
1967
1968<p>
1969Finally, each source file can define its own niladic <code>init</code> function to
1970set up whatever state is required. (Actually each file can have multiple
1971<code>init</code> functions.)
1972And finally means finally: <code>init</code> is called after all the
1973variable declarations in the package have evaluated their initializers,
1974and those are evaluated only after all the imported packages have been
1975initialized.
1976</p>
1977<p>
1978Besides initializations that cannot be expressed as declarations,
1979a common use of <code>init</code> functions is to verify or repair
1980correctness of the program state before real execution begins.
1981</p>
1982
1983<pre>
1984func init() {
1985 if user == "" {
1986 log.Fatal("$USER not set")
1987 }
1988 if home == "" {
1989 home = "/home/" + user
1990 }
1991 if gopath == "" {
1992 gopath = home + "/go"
1993 }
1994 // gopath may be overridden by --gopath flag on command line.
1995 flag.StringVar(&amp;gopath, "gopath", gopath, "override default GOPATH")
1996}
1997</pre>
1998
1999<h2 id="methods">Methods</h2>
2000
2001<h3 id="pointers_vs_values">Pointers vs. Values</h3>
2002<p>
2003As we saw with <code>ByteSize</code>,
2004methods can be defined for any named type (except a pointer or an interface);
2005the receiver does not have to be a struct.
2006</p>
2007<p>
2008In the discussion of slices above, we wrote an <code>Append</code>
2009function. We can define it as a method on slices instead. To do
2010this, we first declare a named type to which we can bind the method, and
2011then make the receiver for the method a value of that type.
2012</p>
2013<pre>
2014type ByteSlice []byte
2015
2016func (slice ByteSlice) Append(data []byte) []byte {
2017 // Body exactly the same as above
2018}
2019</pre>
2020<p>
2021This still requires the method to return the updated slice. We can
2022eliminate that clumsiness by redefining the method to take a
2023<i>pointer</i> to a <code>ByteSlice</code> as its receiver, so the
2024method can overwrite the caller's slice.
2025</p>
2026<pre>
2027func (p *ByteSlice) Append(data []byte) {
2028 slice := *p
2029 // Body as above, without the return.
2030 *p = slice
2031}
2032</pre>
2033<p>
2034In fact, we can do even better. If we modify our function so it looks
2035like a standard <code>Write</code> method, like this,
2036</p>
2037<pre>
2038func (p *ByteSlice) Write(data []byte) (n int, err error) {
2039 slice := *p
2040 // Again as above.
2041 *p = slice
2042 return len(data), nil
2043}
2044</pre>
2045<p>
2046then the type <code>*ByteSlice</code> satisfies the standard interface
2047<code>io.Writer</code>, which is handy. For instance, we can
2048print into one.
2049</p>
2050<pre>
2051 var b ByteSlice
2052 fmt.Fprintf(&amp;b, "This hour has %d days\n", 7)
2053</pre>
2054<p>
2055We pass the address of a <code>ByteSlice</code>
2056because only <code>*ByteSlice</code> satisfies <code>io.Writer</code>.
2057The rule about pointers vs. values for receivers is that value methods
2058can be invoked on pointers and values, but pointer methods can only be
2059invoked on pointers.
2060</p>
2061
2062<p>
2063This rule arises because pointer methods can modify the receiver; invoking
2064them on a value would cause the method to receive a copy of the value, so
2065any modifications would be discarded.
2066The language therefore disallows this mistake.
2067There is a handy exception, though. When the value is addressable, the
2068language takes care of the common case of invoking a pointer method on a
2069value by inserting the address operator automatically.
2070In our example, the variable <code>b</code> is addressable, so we can call
2071its <code>Write</code> method with just <code>b.Write</code>. The compiler
2072will rewrite that to <code>(&amp;b).Write</code> for us.
2073</p>
2074
2075<p>
2076By the way, the idea of using <code>Write</code> on a slice of bytes
2077is central to the implementation of <code>bytes.Buffer</code>.
2078</p>
2079
2080<h2 id="interfaces_and_types">Interfaces and other types</h2>
2081
2082<h3 id="interfaces">Interfaces</h3>
2083<p>
2084Interfaces in Go provide a way to specify the behavior of an
2085object: if something can do <em>this</em>, then it can be used
2086<em>here</em>. We've seen a couple of simple examples already;
2087custom printers can be implemented by a <code>String</code> method
2088while <code>Fprintf</code> can generate output to anything
2089with a <code>Write</code> method.
2090Interfaces with only one or two methods are common in Go code, and are
2091usually given a name derived from the method, such as <code>io.Writer</code>
2092for something that implements <code>Write</code>.
2093</p>
2094<p>
2095A type can implement multiple interfaces.
2096For instance, a collection can be sorted
2097by the routines in package <code>sort</code> if it implements
2098<code>sort.Interface</code>, which contains <code>Len()</code>,
2099<code>Less(i, j int) bool</code>, and <code>Swap(i, j int)</code>,
2100and it could also have a custom formatter.
2101In this contrived example <code>Sequence</code> satisfies both.
2102</p>
2103{{code "/doc/progs/eff_sequence.go" `/^type/` "$"}}
2104
2105<h3 id="conversions">Conversions</h3>
2106
2107<p>
2108The <code>String</code> method of <code>Sequence</code> is recreating the
2109work that <code>Sprint</code> already does for slices. We can share the
2110effort if we convert the <code>Sequence</code> to a plain
2111<code>[]int</code> before calling <code>Sprint</code>.
2112</p>
2113<pre>
2114func (s Sequence) String() string {
2115 sort.Sort(s)
2116 return fmt.Sprint([]int(s))
2117}
2118</pre>
2119<p>
2120This method is another example of the conversion technique for calling
2121<code>Sprintf</code> safely from a <code>String</code> method.
2122Because the two types (<code>Sequence</code> and <code>[]int</code>)
2123are the same if we ignore the type name, it's legal to convert between them.
2124The conversion doesn't create a new value, it just temporarily acts
2125as though the existing value has a new type.
2126(There are other legal conversions, such as from integer to floating point, that
2127do create a new value.)
2128</p>
2129<p>
2130It's an idiom in Go programs to convert the
2131type of an expression to access a different
2132set of methods. As an example, we could use the existing
2133type <code>sort.IntSlice</code> to reduce the entire example
2134to this:
2135</p>
2136<pre>
2137type Sequence []int
2138
2139// Method for printing - sorts the elements before printing
2140func (s Sequence) String() string {
2141 sort.IntSlice(s).Sort()
2142 return fmt.Sprint([]int(s))
2143}
2144</pre>
2145<p>
2146Now, instead of having <code>Sequence</code> implement multiple
2147interfaces (sorting and printing), we're using the ability of a data item to be
2148converted to multiple types (<code>Sequence</code>, <code>sort.IntSlice</code>
2149and <code>[]int</code>), each of which does some part of the job.
2150That's more unusual in practice but can be effective.
2151</p>
2152
2153<h3 id="interface_conversions">Interface conversions and type assertions</h3>
2154
2155<p>
2156<a href="#type_switch">Type switches</a> are a form of conversion: they take an interface and, for
2157each case in the switch, in a sense convert it to the type of that case.
2158Here's a simplified version of how the code under <code>fmt.Printf</code> turns a value into
2159a string using a type switch.
2160If it's already a string, we want the actual string value held by the interface, while if it has a
2161<code>String</code> method we want the result of calling the method.
2162</p>
2163
2164<pre>
2165type Stringer interface {
2166 String() string
2167}
2168
2169var value interface{} // Value provided by caller.
2170switch str := value.(type) {
2171case string:
2172 return str
2173case Stringer:
2174 return str.String()
2175}
2176</pre>
2177
2178<p>
2179The first case finds a concrete value; the second converts the interface into another interface.
2180It's perfectly fine to mix types this way.
2181</p>
2182
2183<p>
2184What if there's only one type we care about? If we know the value holds a <code>string</code>
2185and we just want to extract it?
2186A one-case type switch would do, but so would a <em>type assertion</em>.
2187A type assertion takes an interface value and extracts from it a value of the specified explicit type.
2188The syntax borrows from the clause opening a type switch, but with an explicit
2189type rather than the <code>type</code> keyword:
2190</p>
2191
2192<pre>
2193value.(typeName)
2194</pre>
2195
2196<p>
2197and the result is a new value with the static type <code>typeName</code>.
2198That type must either be the concrete type held by the interface, or a second interface
2199type that the value can be converted to.
2200To extract the string we know is in the value, we could write:
2201</p>
2202
2203<pre>
2204str := value.(string)
2205</pre>
2206
2207<p>
2208But if it turns out that the value does not contain a string, the program will crash with a run-time error.
2209To guard against that, use the "comma, ok" idiom to test, safely, whether the value is a string:
2210</p>
2211
2212<pre>
2213str, ok := value.(string)
2214if ok {
2215 fmt.Printf("string value is: %q\n", str)
2216} else {
2217 fmt.Printf("value is not a string\n")
2218}
2219</pre>
2220
2221<p>
2222If the type assertion fails, <code>str</code> will still exist and be of type string, but it will have
2223the zero value, an empty string.
2224</p>
2225
2226<p>
2227As an illustration of the capability, here's an <code>if</code>-<code>else</code>
2228statement that's equivalent to the type switch that opened this section.
2229</p>
2230
2231<pre>
2232if str, ok := value.(string); ok {
2233 return str
2234} else if str, ok := value.(Stringer); ok {
2235 return str.String()
2236}
2237</pre>
2238
2239<h3 id="generality">Generality</h3>
2240<p>
2241If a type exists only to implement an interface
2242and has no exported methods beyond that interface,
2243there is no need to export the type itself.
2244Exporting just the interface makes it clear that
2245it's the behavior that matters, not the implementation,
2246and that other implementations with different properties
2247can mirror the behavior of the original type.
2248It also avoids the need to repeat the documentation
2249on every instance of a common method.
2250</p>
2251<p>
2252In such cases, the constructor should return an interface value
2253rather than the implementing type.
2254As an example, in the hash libraries
2255both <code>crc32.NewIEEE</code> and <code>adler32.New</code>
2256return the interface type <code>hash.Hash32</code>.
2257Substituting the CRC-32 algorithm for Adler-32 in a Go program
2258requires only changing the constructor call;
2259the rest of the code is unaffected by the change of algorithm.
2260</p>
2261<p>
2262A similar approach allows the streaming cipher algorithms
2263in the various <code>crypto</code> packages to be
2264separated from the block ciphers they chain together.
2265The <code>Block</code> interface
2266in the <code>crypto/cipher</code> package specifies the
2267behavior of a block cipher, which provides encryption
2268of a single block of data.
2269Then, by analogy with the <code>bufio</code> package,
2270cipher packages that implement this interface
2271can be used to construct streaming ciphers, represented
2272by the <code>Stream</code> interface, without
2273knowing the details of the block encryption.
2274</p>
2275<p>
2276The <code>crypto/cipher</code> interfaces look like this:
2277</p>
2278<pre>
2279type Block interface {
2280 BlockSize() int
2281 Encrypt(src, dst []byte)
2282 Decrypt(src, dst []byte)
2283}
2284
2285type Stream interface {
2286 XORKeyStream(dst, src []byte)
2287}
2288</pre>
2289
2290<p>
2291Here's the definition of the counter mode (CTR) stream,
2292which turns a block cipher into a streaming cipher; notice
2293that the block cipher's details are abstracted away:
2294</p>
2295
2296<pre>
2297// NewCTR returns a Stream that encrypts/decrypts using the given Block in
2298// counter mode. The length of iv must be the same as the Block's block size.
2299func NewCTR(block Block, iv []byte) Stream
2300</pre>
2301<p>
2302<code>NewCTR</code> applies not
2303just to one specific encryption algorithm and data source but to any
2304implementation of the <code>Block</code> interface and any
2305<code>Stream</code>. Because they return
2306interface values, replacing CTR
2307encryption with other encryption modes is a localized change. The constructor
2308calls must be edited, but because the surrounding code must treat the result only
2309as a <code>Stream</code>, it won't notice the difference.
2310</p>
2311
2312<h3 id="interface_methods">Interfaces and methods</h3>
2313<p>
2314Since almost anything can have methods attached, almost anything can
2315satisfy an interface. One illustrative example is in the <code>http</code>
2316package, which defines the <code>Handler</code> interface. Any object
2317that implements <code>Handler</code> can serve HTTP requests.
2318</p>
2319<pre>
2320type Handler interface {
2321 ServeHTTP(ResponseWriter, *Request)
2322}
2323</pre>
2324<p>
2325<code>ResponseWriter</code> is itself an interface that provides access
2326to the methods needed to return the response to the client.
2327Those methods include the standard <code>Write</code> method, so an
2328<code>http.ResponseWriter</code> can be used wherever an <code>io.Writer</code>
2329can be used.
2330<code>Request</code> is a struct containing a parsed representation
2331of the request from the client.
2332</p>
2333<p>
2334For brevity, let's ignore POSTs and assume HTTP requests are always
2335GETs; that simplification does not affect the way the handlers are
2336set up. Here's a trivial but complete implementation of a handler to
2337count the number of times the
2338page is visited.
2339</p>
2340<pre>
2341// Simple counter server.
2342type Counter struct {
2343 n int
2344}
2345
2346func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
2347 ctr.n++
2348 fmt.Fprintf(w, "counter = %d\n", ctr.n)
2349}
2350</pre>
2351<p>
2352(Keeping with our theme, note how <code>Fprintf</code> can print to an
2353<code>http.ResponseWriter</code>.)
2354For reference, here's how to attach such a server to a node on the URL tree.
2355</p>
2356<pre>
2357import "net/http"
2358...
2359ctr := new(Counter)
2360http.Handle("/counter", ctr)
2361</pre>
2362<p>
2363But why make <code>Counter</code> a struct? An integer is all that's needed.
2364(The receiver needs to be a pointer so the increment is visible to the caller.)
2365</p>
2366<pre>
2367// Simpler counter server.
2368type Counter int
2369
2370func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
2371 *ctr++
2372 fmt.Fprintf(w, "counter = %d\n", *ctr)
2373}
2374</pre>
2375<p>
2376What if your program has some internal state that needs to be notified that a page
2377has been visited? Tie a channel to the web page.
2378</p>
2379<pre>
2380// A channel that sends a notification on each visit.
2381// (Probably want the channel to be buffered.)
2382type Chan chan *http.Request
2383
2384func (ch Chan) ServeHTTP(w http.ResponseWriter, req *http.Request) {
2385 ch &lt;- req
2386 fmt.Fprint(w, "notification sent")
2387}
2388</pre>
2389<p>
2390Finally, let's say we wanted to present on <code>/args</code> the arguments
2391used when invoking the server binary.
2392It's easy to write a function to print the arguments.
2393</p>
2394<pre>
2395func ArgServer() {
2396 fmt.Println(os.Args)
2397}
2398</pre>
2399<p>
2400How do we turn that into an HTTP server? We could make <code>ArgServer</code>
2401a method of some type whose value we ignore, but there's a cleaner way.
2402Since we can define a method for any type except pointers and interfaces,
2403we can write a method for a function.
2404The <code>http</code> package contains this code:
2405</p>
2406<pre>
2407// The HandlerFunc type is an adapter to allow the use of
2408// ordinary functions as HTTP handlers. If f is a function
2409// with the appropriate signature, HandlerFunc(f) is a
2410// Handler object that calls f.
2411type HandlerFunc func(ResponseWriter, *Request)
2412
2413// ServeHTTP calls f(c, req).
2414func (f HandlerFunc) ServeHTTP(w ResponseWriter, req *Request) {
2415 f(w, req)
2416}
2417</pre>
2418<p>
2419<code>HandlerFunc</code> is a type with a method, <code>ServeHTTP</code>,
2420so values of that type can serve HTTP requests. Look at the implementation
2421of the method: the receiver is a function, <code>f</code>, and the method
2422calls <code>f</code>. That may seem odd but it's not that different from, say,
2423the receiver being a channel and the method sending on the channel.
2424</p>
2425<p>
2426To make <code>ArgServer</code> into an HTTP server, we first modify it
2427to have the right signature.
2428</p>
2429<pre>
2430// Argument server.
2431func ArgServer(w http.ResponseWriter, req *http.Request) {
2432 fmt.Fprintln(w, os.Args)
2433}
2434</pre>
2435<p>
2436<code>ArgServer</code> now has same signature as <code>HandlerFunc</code>,
2437so it can be converted to that type to access its methods,
2438just as we converted <code>Sequence</code> to <code>IntSlice</code>
2439to access <code>IntSlice.Sort</code>.
2440The code to set it up is concise:
2441</p>
2442<pre>
2443http.Handle("/args", http.HandlerFunc(ArgServer))
2444</pre>
2445<p>
2446When someone visits the page <code>/args</code>,
2447the handler installed at that page has value <code>ArgServer</code>
2448and type <code>HandlerFunc</code>.
2449The HTTP server will invoke the method <code>ServeHTTP</code>
2450of that type, with <code>ArgServer</code> as the receiver, which will in turn call
2451<code>ArgServer</code> (via the invocation <code>f(c, req)</code>
2452inside <code>HandlerFunc.ServeHTTP</code>).
2453The arguments will then be displayed.
2454</p>
2455<p>
2456In this section we have made an HTTP server from a struct, an integer,
2457a channel, and a function, all because interfaces are just sets of
2458methods, which can be defined for (almost) any type.
2459</p>
2460
2461<h2 id="blank">The blank identifier</h2>
2462
2463<p>
2464We've mentioned the blank identifier a couple of times now, in the context of
2465<a href="#for"><code>for</code> <code>range</code> loops</a>
2466and <a href="#maps">maps</a>.
2467The blank identifier can be assigned or declared with any value of any type, with the
2468value discarded harmlessly.
2469It's a bit like writing to the Unix <code>/dev/null</code> file:
2470it represents a write-only value
2471to be used as a place-holder
2472where a variable is needed but the actual value is irrelevant.
2473It has uses beyond those we've seen already.
2474</p>
2475
2476<h3 id="blank_assign">The blank identifier in multiple assignment</h3>
2477
2478<p>
2479The use of a blank identifier in a <code>for</code> <code>range</code> loop is a
2480special case of a general situation: multiple assignment.
2481</p>
2482
2483<p>
2484If an assignment requires multiple values on the left side,
2485but one of the values will not be used by the program,
2486a blank identifier on the left-hand-side of
2487the assignment avoids the need
2488to create a dummy variable and makes it clear that the
2489value is to be discarded.
2490For instance, when calling a function that returns
2491a value and an error, but only the error is important,
2492use the blank identifier to discard the irrelevant value.
2493</p>
2494
2495<pre>
2496if _, err := os.Stat(path); os.IsNotExist(err) {
2497 fmt.Printf("%s does not exist\n", path)
2498}
2499</pre>
2500
2501<p>
2502Occasionally you'll see code that discards the error value in order
2503to ignore the error; this is terrible practice. Always check error returns;
2504they're provided for a reason.
2505</p>
2506
2507<pre>
2508// Bad! This code will crash if path does not exist.
2509fi, _ := os.Stat(path)
2510if fi.IsDir() {
2511 fmt.Printf("%s is a directory\n", path)
2512}
2513</pre>
2514
2515<h3 id="blank_unused">Unused imports and variables</h3>
2516
2517<p>
2518It is an error to import a package or to declare a variable without using it.
2519Unused imports bloat the program and slow compilation,
2520while a variable that is initialized but not used is at least
2521a wasted computation and perhaps indicative of a
2522larger bug.
2523When a program is under active development, however,
2524unused imports and variables often arise and it can
2525be annoying to delete them just to have the compilation proceed,
2526only to have them be needed again later.
2527The blank identifier provides a workaround.
2528</p>
2529<p>
2530This half-written program has two unused imports
2531(<code>fmt</code> and <code>io</code>)
2532and an unused variable (<code>fd</code>),
2533so it will not compile, but it would be nice to see if the
2534code so far is correct.
2535</p>
2536{{code "/doc/progs/eff_unused1.go" `/package/` `$`}}
2537<p>
2538To silence complaints about the unused imports, use a
2539blank identifier to refer to a symbol from the imported package.
2540Similarly, assigning the unused variable <code>fd</code>
2541to the blank identifier will silence the unused variable error.
2542This version of the program does compile.
2543</p>
2544{{code "/doc/progs/eff_unused2.go" `/package/` `$`}}
2545
2546<p>
2547By convention, the global declarations to silence import errors
2548should come right after the imports and be commented,
2549both to make them easy to find and as a reminder to clean things up later.
2550</p>
2551
2552<h3 id="blank_import">Import for side effect</h3>
2553
2554<p>
2555An unused import like <code>fmt</code> or <code>io</code> in the
2556previous example should eventually be used or removed:
2557blank assignments identify code as a work in progress.
2558But sometimes it is useful to import a package only for its
2559side effects, without any explicit use.
2560For example, during its <code>init</code> function,
2561the <code><a href="/pkg/net/http/pprof/">net/http/pprof</a></code>
2562package registers HTTP handlers that provide
2563debugging information. It has an exported API, but
2564most clients need only the handler registration and
2565access the data through a web page.
2566To import the package only for its side effects, rename the package
2567to the blank identifier:
2568</p>
2569<pre>
2570import _ "net/http/pprof"
2571</pre>
2572<p>
2573This form of import makes clear that the package is being
2574imported for its side effects, because there is no other possible
2575use of the package: in this file, it doesn't have a name.
2576(If it did, and we didn't use that name, the compiler would reject the program.)
2577</p>
2578
2579<h3 id="blank_implements">Interface checks</h3>
2580
2581<p>
2582As we saw in the discussion of <a href="#interfaces_and_types">interfaces</a> above,
2583a type need not declare explicitly that it implements an interface.
2584Instead, a type implements the interface just by implementing the interface's methods.
2585In practice, most interface conversions are static and therefore checked at compile time.
2586For example, passing an <code>*os.File</code> to a function
2587expecting an <code>io.Reader</code> will not compile unless
2588<code>*os.File</code> implements the <code>io.Reader</code> interface.
2589</p>
2590
2591<p>
2592Some interface checks do happen at run-time, though.
2593One instance is in the <code><a href="/pkg/encoding/json/">encoding/json</a></code>
2594package, which defines a <code><a href="/pkg/encoding/json/#Marshaler">Marshaler</a></code>
2595interface. When the JSON encoder receives a value that implements that interface,
2596the encoder invokes the value's marshaling method to convert it to JSON
2597instead of doing the standard conversion.
2598The encoder checks this property at run time with a <a href="#interface_conversions">type assertion</a> like:
2599</p>
2600
2601<pre>
2602m, ok := val.(json.Marshaler)
2603</pre>
2604
2605<p>
2606If it's necessary only to ask whether a type implements an interface, without
2607actually using the interface itself, perhaps as part of an error check, use the blank
2608identifier to ignore the type-asserted value:
2609</p>
2610
2611<pre>
2612if _, ok := val.(json.Marshaler); ok {
2613 fmt.Printf("value %v of type %T implements json.Marshaler\n", val, val)
2614}
2615</pre>
2616
2617<p>
2618One place this situation arises is when it is necessary to guarantee within the package implementing the type that
2619it actually satisfies the interface.
2620If a type—for example,
2621<code><a href="/pkg/encoding/json/#RawMessage">json.RawMessage</a></code>—needs
2622a custom JSON representation, it should implement
2623<code>json.Marshaler</code>, but there are no static conversions that would
2624cause the compiler to verify this automatically.
2625If the type inadvertently fails to satisfy the interface, the JSON encoder will still work,
2626but will not use the custom implementation.
2627To guarantee that the implementation is correct,
2628a global declaration using the blank identifier can be used in the package:
2629</p>
2630<pre>
2631var _ json.Marshaler = (*RawMessage)(nil)
2632</pre>
2633<p>
2634In this declaration, the assignment involving a conversion of a
2635<code>*RawMessage</code> to a <code>Marshaler</code>
2636requires that <code>*RawMessage</code> implements <code>Marshaler</code>,
2637and that property will be checked at compile time.
2638Should the <code>json.Marshaler</code> interface change, this package
2639will no longer compile and we will be on notice that it needs to be updated.
2640</p>
2641
2642<p>
2643The appearance of the blank identifier in this construct indicates that
2644the declaration exists only for the type checking,
2645not to create a variable.
2646Don't do this for every type that satisfies an interface, though.
2647By convention, such declarations are only used
2648when there are no static conversions already present in the code,
2649which is a rare event.
2650</p>
2651
2652
2653<h2 id="embedding">Embedding</h2>
2654
2655<p>
2656Go does not provide the typical, type-driven notion of subclassing,
2657but it does have the ability to &ldquo;borrow&rdquo; pieces of an
2658implementation by <em>embedding</em> types within a struct or
2659interface.
2660</p>
2661<p>
2662Interface embedding is very simple.
2663We've mentioned the <code>io.Reader</code> and <code>io.Writer</code> interfaces before;
2664here are their definitions.
2665</p>
2666<pre>
2667type Reader interface {
2668 Read(p []byte) (n int, err error)
2669}
2670
2671type Writer interface {
2672 Write(p []byte) (n int, err error)
2673}
2674</pre>
2675<p>
2676The <code>io</code> package also exports several other interfaces
2677that specify objects that can implement several such methods.
2678For instance, there is <code>io.ReadWriter</code>, an interface
2679containing both <code>Read</code> and <code>Write</code>.
2680We could specify <code>io.ReadWriter</code> by listing the
2681two methods explicitly, but it's easier and more evocative
2682to embed the two interfaces to form the new one, like this:
2683</p>
2684<pre>
2685// ReadWriter is the interface that combines the Reader and Writer interfaces.
2686type ReadWriter interface {
2687 Reader
2688 Writer
2689}
2690</pre>
2691<p>
2692This says just what it looks like: A <code>ReadWriter</code> can do
2693what a <code>Reader</code> does <em>and</em> what a <code>Writer</code>
2694does; it is a union of the embedded interfaces (which must be disjoint
2695sets of methods).
2696Only interfaces can be embedded within interfaces.
2697</p>
2698<p>
2699The same basic idea applies to structs, but with more far-reaching
2700implications. The <code>bufio</code> package has two struct types,
2701<code>bufio.Reader</code> and <code>bufio.Writer</code>, each of
2702which of course implements the analogous interfaces from package
2703<code>io</code>.
2704And <code>bufio</code> also implements a buffered reader/writer,
2705which it does by combining a reader and a writer into one struct
2706using embedding: it lists the types within the struct
2707but does not give them field names.
2708</p>
2709<pre>
2710// ReadWriter stores pointers to a Reader and a Writer.
2711// It implements io.ReadWriter.
2712type ReadWriter struct {
2713 *Reader // *bufio.Reader
2714 *Writer // *bufio.Writer
2715}
2716</pre>
2717<p>
2718The embedded elements are pointers to structs and of course
2719must be initialized to point to valid structs before they
2720can be used.
2721The <code>ReadWriter</code> struct could be written as
2722</p>
2723<pre>
2724type ReadWriter struct {
2725 reader *Reader
2726 writer *Writer
2727}
2728</pre>
2729<p>
2730but then to promote the methods of the fields and to
2731satisfy the <code>io</code> interfaces, we would also need
2732to provide forwarding methods, like this:
2733</p>
2734<pre>
2735func (rw *ReadWriter) Read(p []byte) (n int, err error) {
2736 return rw.reader.Read(p)
2737}
2738</pre>
2739<p>
2740By embedding the structs directly, we avoid this bookkeeping.
2741The methods of embedded types come along for free, which means that <code>bufio.ReadWriter</code>
2742not only has the methods of <code>bufio.Reader</code> and <code>bufio.Writer</code>,
2743it also satisfies all three interfaces:
2744<code>io.Reader</code>,
2745<code>io.Writer</code>, and
2746<code>io.ReadWriter</code>.
2747</p>
2748<p>
2749There's an important way in which embedding differs from subclassing. When we embed a type,
2750the methods of that type become methods of the outer type,
2751but when they are invoked the receiver of the method is the inner type, not the outer one.
2752In our example, when the <code>Read</code> method of a <code>bufio.ReadWriter</code> is
2753invoked, it has exactly the same effect as the forwarding method written out above;
2754the receiver is the <code>reader</code> field of the <code>ReadWriter</code>, not the
2755<code>ReadWriter</code> itself.
2756</p>
2757<p>
2758Embedding can also be a simple convenience.
2759This example shows an embedded field alongside a regular, named field.
2760</p>
2761<pre>
2762type Job struct {
2763 Command string
2764 *log.Logger
2765}
2766</pre>
2767<p>
2768The <code>Job</code> type now has the <code>Log</code>, <code>Logf</code>
2769and other
2770methods of <code>*log.Logger</code>. We could have given the <code>Logger</code>
2771a field name, of course, but it's not necessary to do so. And now, once
2772initialized, we can
2773log to the <code>Job</code>:
2774</p>
2775<pre>
2776job.Log("starting now...")
2777</pre>
2778<p>
2779The <code>Logger</code> is a regular field of the <code>Job</code> struct,
2780so we can initialize it in the usual way inside the constructor for <code>Job</code>, like this,
2781</p>
2782<pre>
2783func NewJob(command string, logger *log.Logger) *Job {
2784 return &amp;Job{command, logger}
2785}
2786</pre>
2787<p>
2788or with a composite literal,
2789</p>
2790<pre>
2791job := &amp;Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}
2792</pre>
2793<p>
2794If we need to refer to an embedded field directly, the type name of the field,
2795ignoring the package qualifier, serves as a field name, as it did
2796in the <code>Read</code> method of our <code>ReaderWriter</code> struct.
2797Here, if we needed to access the
2798<code>*log.Logger</code> of a <code>Job</code> variable <code>job</code>,
2799we would write <code>job.Logger</code>,
2800which would be useful if we wanted to refine the methods of <code>Logger</code>.
2801</p>
2802<pre>
2803func (job *Job) Logf(format string, args ...interface{}) {
2804 job.Logger.Logf("%q: %s", job.Command, fmt.Sprintf(format, args...))
2805}
2806</pre>
2807<p>
2808Embedding types introduces the problem of name conflicts but the rules to resolve
2809them are simple.
2810First, a field or method <code>X</code> hides any other item <code>X</code> in a more deeply
2811nested part of the type.
2812If <code>log.Logger</code> contained a field or method called <code>Command</code>, the <code>Command</code> field
2813of <code>Job</code> would dominate it.
2814</p>
2815<p>
2816Second, if the same name appears at the same nesting level, it is usually an error;
2817it would be erroneous to embed <code>log.Logger</code> if the <code>Job</code> struct
2818contained another field or method called <code>Logger</code>.
2819However, if the duplicate name is never mentioned in the program outside the type definition, it is OK.
2820This qualification provides some protection against changes made to types embedded from outside; there
2821is no problem if a field is added that conflicts with another field in another subtype if neither field
2822is ever used.
2823</p>
2824
2825
2826<h2 id="concurrency">Concurrency</h2>
2827
2828<h3 id="sharing">Share by communicating</h3>
2829
2830<p>
2831Concurrent programming is a large topic and there is space only for some
2832Go-specific highlights here.
2833</p>
2834<p>
2835Concurrent programming in many environments is made difficult by the
2836subtleties required to implement correct access to shared variables. Go encourages
2837a different approach in which shared values are passed around on channels
2838and, in fact, never actively shared by separate threads of execution.
2839Only one goroutine has access to the value at any given time.
2840Data races cannot occur, by design.
2841To encourage this way of thinking we have reduced it to a slogan:
2842</p>
2843<blockquote>
2844Do not communicate by sharing memory;
2845instead, share memory by communicating.
2846</blockquote>
2847<p>
2848This approach can be taken too far. Reference counts may be best done
2849by putting a mutex around an integer variable, for instance. But as a
2850high-level approach, using channels to control access makes it easier
2851to write clear, correct programs.
2852</p>
2853<p>
2854One way to think about this model is to consider a typical single-threaded
2855program running on one CPU. It has no need for synchronization primitives.
2856Now run another such instance; it too needs no synchronization. Now let those
2857two communicate; if the communication is the synchronizer, there's still no need
2858for other synchronization. Unix pipelines, for example, fit this model
2859perfectly. Although Go's approach to concurrency originates in Hoare's
2860Communicating Sequential Processes (CSP),
2861it can also be seen as a type-safe generalization of Unix pipes.
2862</p>
2863
2864<h3 id="goroutines">Goroutines</h3>
2865
2866<p>
2867They're called <em>goroutines</em> because the existing
2868terms&mdash;threads, coroutines, processes, and so on&mdash;convey
2869inaccurate connotations. A goroutine has a simple model: it is a
2870function executing concurrently with other goroutines in the same
2871address space. It is lightweight, costing little more than the
2872allocation of stack space.
2873And the stacks start small, so they are cheap, and grow
2874by allocating (and freeing) heap storage as required.
2875</p>
2876<p>
2877Goroutines are multiplexed onto multiple OS threads so if one should
2878block, such as while waiting for I/O, others continue to run. Their
2879design hides many of the complexities of thread creation and
2880management.
2881</p>
2882<p>
2883Prefix a function or method call with the <code>go</code>
2884keyword to run the call in a new goroutine.
2885When the call completes, the goroutine
2886exits, silently. (The effect is similar to the Unix shell's
2887<code>&amp;</code> notation for running a command in the
2888background.)
2889</p>
2890<pre>
2891go list.Sort() // run list.Sort concurrently; don't wait for it.
2892</pre>
2893<p>
2894A function literal can be handy in a goroutine invocation.
2895</p>
2896<pre>
2897func Announce(message string, delay time.Duration) {
2898 go func() {
2899 time.Sleep(delay)
2900 fmt.Println(message)
2901 }() // Note the parentheses - must call the function.
2902}
2903</pre>
2904<p>
2905In Go, function literals are closures: the implementation makes
2906sure the variables referred to by the function survive as long as they are active.
2907</p>
2908<p>
2909These examples aren't too practical because the functions have no way of signaling
2910completion. For that, we need channels.
2911</p>
2912
2913<h3 id="channels">Channels</h3>
2914
2915<p>
2916Like maps, channels are allocated with <code>make</code>, and
2917the resulting value acts as a reference to an underlying data structure.
2918If an optional integer parameter is provided, it sets the buffer size for the channel.
2919The default is zero, for an unbuffered or synchronous channel.
2920</p>
2921<pre>
2922ci := make(chan int) // unbuffered channel of integers
2923cj := make(chan int, 0) // unbuffered channel of integers
2924cs := make(chan *os.File, 100) // buffered channel of pointers to Files
2925</pre>
2926<p>
2927Unbuffered channels combine communication&mdash;the exchange of a value&mdash;with
2928synchronization&mdash;guaranteeing that two calculations (goroutines) are in
2929a known state.
2930</p>
2931<p>
2932There are lots of nice idioms using channels. Here's one to get us started.
2933In the previous section we launched a sort in the background. A channel
2934can allow the launching goroutine to wait for the sort to complete.
2935</p>
2936<pre>
2937c := make(chan int) // Allocate a channel.
2938// Start the sort in a goroutine; when it completes, signal on the channel.
2939go func() {
2940 list.Sort()
2941 c &lt;- 1 // Send a signal; value does not matter.
2942}()
2943doSomethingForAWhile()
2944&lt;-c // Wait for sort to finish; discard sent value.
2945</pre>
2946<p>
2947Receivers always block until there is data to receive.
2948If the channel is unbuffered, the sender blocks until the receiver has
2949received the value.
2950If the channel has a buffer, the sender blocks only until the
2951value has been copied to the buffer; if the buffer is full, this
2952means waiting until some receiver has retrieved a value.
2953</p>
2954<p>
2955A buffered channel can be used like a semaphore, for instance to
2956limit throughput. In this example, incoming requests are passed
2957to <code>handle</code>, which sends a value into the channel, processes
2958the request, and then receives a value from the channel
2959to ready the &ldquo;semaphore&rdquo; for the next consumer.
2960The capacity of the channel buffer limits the number of
2961simultaneous calls to <code>process</code>.
2962</p>
2963<pre>
2964var sem = make(chan int, MaxOutstanding)
2965
2966func handle(r *Request) {
2967 sem &lt;- 1 // Wait for active queue to drain.
2968 process(r) // May take a long time.
2969 &lt;-sem // Done; enable next request to run.
2970}
2971
2972func Serve(queue chan *Request) {
2973 for {
2974 req := &lt;-queue
2975 go handle(req) // Don't wait for handle to finish.
2976 }
2977}
2978</pre>
2979
2980<p>
2981Once <code>MaxOutstanding</code> handlers are executing <code>process</code>,
2982any more will block trying to send into the filled channel buffer,
2983until one of the existing handlers finishes and receives from the buffer.
2984</p>
2985
2986<p>
2987This design has a problem, though: <code>Serve</code>
2988creates a new goroutine for
2989every incoming request, even though only <code>MaxOutstanding</code>
2990of them can run at any moment.
2991As a result, the program can consume unlimited resources if the requests come in too fast.
2992We can address that deficiency by changing <code>Serve</code> to
2993gate the creation of the goroutines.
2994Here's an obvious solution, but beware it has a bug we'll fix subsequently:
2995</p>
2996
2997<pre>
2998func Serve(queue chan *Request) {
2999 for req := range queue {
3000 sem &lt;- 1
3001 go func() {
3002 process(req) // Buggy; see explanation below.
3003 &lt;-sem
3004 }()
3005 }
3006}</pre>
3007
3008<p>
3009The bug is that in a Go <code>for</code> loop, the loop variable
3010is reused for each iteration, so the <code>req</code>
3011variable is shared across all goroutines.
3012That's not what we want.
3013We need to make sure that <code>req</code> is unique for each goroutine.
3014Here's one way to do that, passing the value of <code>req</code> as an argument
3015to the closure in the goroutine:
3016</p>
3017
3018<pre>
3019func Serve(queue chan *Request) {
3020 for req := range queue {
3021 sem &lt;- 1
3022 go func(req *Request) {
3023 process(req)
3024 &lt;-sem
3025 }(req)
3026 }
3027}</pre>
3028
3029<p>
3030Compare this version with the previous to see the difference in how
3031the closure is declared and run.
3032Another solution is just to create a new variable with the same
3033name, as in this example:
3034</p>
3035
3036<pre>
3037func Serve(queue chan *Request) {
3038 for req := range queue {
3039 req := req // Create new instance of req for the goroutine.
3040 sem &lt;- 1
3041 go func() {
3042 process(req)
3043 &lt;-sem
3044 }()
3045 }
3046}</pre>
3047
3048<p>
3049It may seem odd to write
3050</p>
3051
3052<pre>
3053req := req
3054</pre>
3055
3056<p>
3057but it's a legal and idiomatic in Go to do this.
3058You get a fresh version of the variable with the same name, deliberately
3059shadowing the loop variable locally but unique to each goroutine.
3060</p>
3061
3062<p>
3063Going back to the general problem of writing the server,
3064another approach that manages resources well is to start a fixed
3065number of <code>handle</code> goroutines all reading from the request
3066channel.
3067The number of goroutines limits the number of simultaneous
3068calls to <code>process</code>.
3069This <code>Serve</code> function also accepts a channel on which
3070it will be told to exit; after launching the goroutines it blocks
3071receiving from that channel.
3072</p>
3073
3074<pre>
3075func handle(queue chan *Request) {
3076 for r := range queue {
3077 process(r)
3078 }
3079}
3080
3081func Serve(clientRequests chan *Request, quit chan bool) {
3082 // Start handlers
3083 for i := 0; i &lt; MaxOutstanding; i++ {
3084 go handle(clientRequests)
3085 }
3086 &lt;-quit // Wait to be told to exit.
3087}
3088</pre>
3089
3090<h3 id="chan_of_chan">Channels of channels</h3>
3091<p>
3092One of the most important properties of Go is that
3093a channel is a first-class value that can be allocated and passed
3094around like any other. A common use of this property is
3095to implement safe, parallel demultiplexing.
3096</p>
3097<p>
3098In the example in the previous section, <code>handle</code> was
3099an idealized handler for a request but we didn't define the
3100type it was handling. If that type includes a channel on which
3101to reply, each client can provide its own path for the answer.
3102Here's a schematic definition of type <code>Request</code>.
3103</p>
3104<pre>
3105type Request struct {
3106 args []int
3107 f func([]int) int
3108 resultChan chan int
3109}
3110</pre>
3111<p>
3112The client provides a function and its arguments, as well as
3113a channel inside the request object on which to receive the answer.
3114</p>
3115<pre>
3116func sum(a []int) (s int) {
3117 for _, v := range a {
3118 s += v
3119 }
3120 return
3121}
3122
3123request := &amp;Request{[]int{3, 4, 5}, sum, make(chan int)}
3124// Send request
3125clientRequests &lt;- request
3126// Wait for response.
3127fmt.Printf("answer: %d\n", &lt;-request.resultChan)
3128</pre>
3129<p>
3130On the server side, the handler function is the only thing that changes.
3131</p>
3132<pre>
3133func handle(queue chan *Request) {
3134 for req := range queue {
3135 req.resultChan &lt;- req.f(req.args)
3136 }
3137}
3138</pre>
3139<p>
3140There's clearly a lot more to do to make it realistic, but this
3141code is a framework for a rate-limited, parallel, non-blocking RPC
3142system, and there's not a mutex in sight.
3143</p>
3144
3145<h3 id="parallel">Parallelization</h3>
3146<p>
3147Another application of these ideas is to parallelize a calculation
3148across multiple CPU cores. If the calculation can be broken into
3149separate pieces that can execute independently, it can be parallelized,
3150with a channel to signal when each piece completes.
3151</p>
3152<p>
3153Let's say we have an expensive operation to perform on a vector of items,
3154and that the value of the operation on each item is independent,
3155as in this idealized example.
3156</p>
3157<pre>
3158type Vector []float64
3159
3160// Apply the operation to v[i], v[i+1] ... up to v[n-1].
3161func (v Vector) DoSome(i, n int, u Vector, c chan int) {
3162 for ; i &lt; n; i++ {
3163 v[i] += u.Op(v[i])
3164 }
3165 c &lt;- 1 // signal that this piece is done
3166}
3167</pre>
3168<p>
3169We launch the pieces independently in a loop, one per CPU.
3170They can complete in any order but it doesn't matter; we just
3171count the completion signals by draining the channel after
3172launching all the goroutines.
3173</p>
3174<pre>
3175const NCPU = 4 // number of CPU cores
3176
3177func (v Vector) DoAll(u Vector) {
3178 c := make(chan int, NCPU) // Buffering optional but sensible.
3179 for i := 0; i &lt; NCPU; i++ {
3180 go v.DoSome(i*len(v)/NCPU, (i+1)*len(v)/NCPU, u, c)
3181 }
3182 // Drain the channel.
3183 for i := 0; i &lt; NCPU; i++ {
3184 &lt;-c // wait for one task to complete
3185 }
3186 // All done.
3187}
3188
3189</pre>
3190
3191<p>
3192The current implementation of the Go runtime
3193will not parallelize this code by default.
3194It dedicates only a single core to user-level processing. An
3195arbitrary number of goroutines can be blocked in system calls, but
3196by default only one can be executing user-level code at any time.
3197It should be smarter and one day it will be smarter, but until it
3198is if you want CPU parallelism you must tell the run-time
3199how many goroutines you want executing code simultaneously. There
3200are two related ways to do this. Either run your job with environment
3201variable <code>GOMAXPROCS</code> set to the number of cores to use
3202or import the <code>runtime</code> package and call
3203<code>runtime.GOMAXPROCS(NCPU)</code>.
3204A helpful value might be <code>runtime.NumCPU()</code>, which reports the number
3205of logical CPUs on the local machine.
3206Again, this requirement is expected to be retired as the scheduling and run-time improve.
3207</p>
3208
3209<p>
3210Be sure not to confuse the ideas of concurrency—structuring a program
3211as independently executing components—and parallelism—executing
3212calculations in parallel for efficiency on multiple CPUs.
3213Although the concurrency features of Go can make some problems easy
3214to structure as parallel computations, Go is a concurrent language,
3215not a parallel one, and not all parallelization problems fit Go's model.
3216For a discussion of the distinction, see the talk cited in
3217<a href="//blog.golang.org/2013/01/concurrency-is-not-parallelism.html">this
3218blog post</a>.
3219
3220<h3 id="leaky_buffer">A leaky buffer</h3>
3221
3222<p>
3223The tools of concurrent programming can even make non-concurrent
3224ideas easier to express. Here's an example abstracted from an RPC
3225package. The client goroutine loops receiving data from some source,
3226perhaps a network. To avoid allocating and freeing buffers, it keeps
3227a free list, and uses a buffered channel to represent it. If the
3228channel is empty, a new buffer gets allocated.
3229Once the message buffer is ready, it's sent to the server on
3230<code>serverChan</code>.
3231</p>
3232<pre>
3233var freeList = make(chan *Buffer, 100)
3234var serverChan = make(chan *Buffer)
3235
3236func client() {
3237 for {
3238 var b *Buffer
3239 // Grab a buffer if available; allocate if not.
3240 select {
3241 case b = &lt;-freeList:
3242 // Got one; nothing more to do.
3243 default:
3244 // None free, so allocate a new one.
3245 b = new(Buffer)
3246 }
3247 load(b) // Read next message from the net.
3248 serverChan &lt;- b // Send to server.
3249 }
3250}
3251</pre>
3252<p>
3253The server loop receives each message from the client, processes it,
3254and returns the buffer to the free list.
3255</p>
3256<pre>
3257func server() {
3258 for {
3259 b := &lt;-serverChan // Wait for work.
3260 process(b)
3261 // Reuse buffer if there's room.
3262 select {
3263 case freeList &lt;- b:
3264 // Buffer on free list; nothing more to do.
3265 default:
3266 // Free list full, just carry on.
3267 }
3268 }
3269}
3270</pre>
3271<p>
3272The client attempts to retrieve a buffer from <code>freeList</code>;
3273if none is available, it allocates a fresh one.
3274The server's send to <code>freeList</code> puts <code>b</code> back
3275on the free list unless the list is full, in which case the
3276buffer is dropped on the floor to be reclaimed by
3277the garbage collector.
3278(The <code>default</code> clauses in the <code>select</code>
3279statements execute when no other case is ready,
3280meaning that the <code>selects</code> never block.)
3281This implementation builds a leaky bucket free list
3282in just a few lines, relying on the buffered channel and
3283the garbage collector for bookkeeping.
3284</p>
3285
3286<h2 id="errors">Errors</h2>
3287
3288<p>
3289Library routines must often return some sort of error indication to
3290the caller.
3291As mentioned earlier, Go's multivalue return makes it
3292easy to return a detailed error description alongside the normal
3293return value.
3294It is good style to use this feature to provide detailed error information.
3295For example, as we'll see, <code>os.Open</code> doesn't
3296just return a <code>nil</code> pointer on failure, it also returns an
3297error value that describes what went wrong.
3298</p>
3299
3300<p>
3301By convention, errors have type <code>error</code>,
3302a simple built-in interface.
3303</p>
3304<pre>
3305type error interface {
3306 Error() string
3307}
3308</pre>
3309<p>
3310A library writer is free to implement this interface with a
3311richer model under the covers, making it possible not only
3312to see the error but also to provide some context.
3313As mentioned, alongside the usual <code>*os.File</code>
3314return value, <code>os.Open</code> also returns an
3315error value.
3316If the file is opened successfully, the error will be <code>nil</code>,
3317but when there is a problem, it will hold an
3318<code>os.PathError</code>:
3319</p>
3320<pre>
3321// PathError records an error and the operation and
3322// file path that caused it.
3323type PathError struct {
3324 Op string // "open", "unlink", etc.
3325 Path string // The associated file.
3326 Err error // Returned by the system call.
3327}
3328
3329func (e *PathError) Error() string {
3330 return e.Op + " " + e.Path + ": " + e.Err.Error()
3331}
3332</pre>
3333<p>
3334<code>PathError</code>'s <code>Error</code> generates
3335a string like this:
3336</p>
3337<pre>
3338open /etc/passwx: no such file or directory
3339</pre>
3340<p>
3341Such an error, which includes the problematic file name, the
3342operation, and the operating system error it triggered, is useful even
3343if printed far from the call that caused it;
3344it is much more informative than the plain
3345"no such file or directory".
3346</p>
3347
3348<p>
3349When feasible, error strings should identify their origin, such as by having
3350a prefix naming the operation or package that generated the error. For example, in package
3351<code>image</code>, the string representation for a decoding error due to an
3352unknown format is "image: unknown format".
3353</p>
3354
3355<p>
3356Callers that care about the precise error details can
3357use a type switch or a type assertion to look for specific
3358errors and extract details. For <code>PathErrors</code>
3359this might include examining the internal <code>Err</code>
3360field for recoverable failures.
3361</p>
3362
3363<pre>
3364for try := 0; try &lt; 2; try++ {
3365 file, err = os.Create(filename)
3366 if err == nil {
3367 return
3368 }
3369 if e, ok := err.(*os.PathError); ok &amp;&amp; e.Err == syscall.ENOSPC {
3370 deleteTempFiles() // Recover some space.
3371 continue
3372 }
3373 return
3374}
3375</pre>
3376
3377<p>
3378The second <code>if</code> statement here is another <a href="#interface_conversions">type assertion</a>.
3379If it fails, <code>ok</code> will be false, and <code>e</code>
3380will be <code>nil</code>.
3381If it succeeds, <code>ok</code> will be true, which means the
3382error was of type <code>*os.PathError</code>, and then so is <code>e</code>,
3383which we can examine for more information about the error.
3384</p>
3385
3386<h3 id="panic">Panic</h3>
3387
3388<p>
3389The usual way to report an error to a caller is to return an
3390<code>error</code> as an extra return value. The canonical
3391<code>Read</code> method is a well-known instance; it returns a byte
3392count and an <code>error</code>. But what if the error is
3393unrecoverable? Sometimes the program simply cannot continue.
3394</p>
3395
3396<p>
3397For this purpose, there is a built-in function <code>panic</code>
3398that in effect creates a run-time error that will stop the program
3399(but see the next section). The function takes a single argument
3400of arbitrary type&mdash;often a string&mdash;to be printed as the
3401program dies. It's also a way to indicate that something impossible has
3402happened, such as exiting an infinite loop.
3403</p>
3404
3405
3406<pre>
3407// A toy implementation of cube root using Newton's method.
3408func CubeRoot(x float64) float64 {
3409 z := x/3 // Arbitrary initial value
3410 for i := 0; i &lt; 1e6; i++ {
3411 prevz := z
3412 z -= (z*z*z-x) / (3*z*z)
3413 if veryClose(z, prevz) {
3414 return z
3415 }
3416 }
3417 // A million iterations has not converged; something is wrong.
3418 panic(fmt.Sprintf("CubeRoot(%g) did not converge", x))
3419}
3420</pre>
3421
3422<p>
3423This is only an example but real library functions should
3424avoid <code>panic</code>. If the problem can be masked or worked
3425around, it's always better to let things continue to run rather
3426than taking down the whole program. One possible counterexample
3427is during initialization: if the library truly cannot set itself up,
3428it might be reasonable to panic, so to speak.
3429</p>
3430
3431<pre>
3432var user = os.Getenv("USER")
3433
3434func init() {
3435 if user == "" {
3436 panic("no value for $USER")
3437 }
3438}
3439</pre>
3440
3441<h3 id="recover">Recover</h3>
3442
3443<p>
3444When <code>panic</code> is called, including implicitly for run-time
3445errors such as indexing a slice out of bounds or failing a type
3446assertion, it immediately stops execution of the current function
3447and begins unwinding the stack of the goroutine, running any deferred
3448functions along the way. If that unwinding reaches the top of the
3449goroutine's stack, the program dies. However, it is possible to
3450use the built-in function <code>recover</code> to regain control
3451of the goroutine and resume normal execution.
3452</p>
3453
3454<p>
3455A call to <code>recover</code> stops the unwinding and returns the
3456argument passed to <code>panic</code>. Because the only code that
3457runs while unwinding is inside deferred functions, <code>recover</code>
3458is only useful inside deferred functions.
3459</p>
3460
3461<p>
3462One application of <code>recover</code> is to shut down a failing goroutine
3463inside a server without killing the other executing goroutines.
3464</p>
3465
3466<pre>
3467func server(workChan &lt;-chan *Work) {
3468 for work := range workChan {
3469 go safelyDo(work)
3470 }
3471}
3472
3473func safelyDo(work *Work) {
3474 defer func() {
3475 if err := recover(); err != nil {
3476 log.Println("work failed:", err)
3477 }
3478 }()
3479 do(work)
3480}
3481</pre>
3482
3483<p>
3484In this example, if <code>do(work)</code> panics, the result will be
3485logged and the goroutine will exit cleanly without disturbing the
3486others. There's no need to do anything else in the deferred closure;
3487calling <code>recover</code> handles the condition completely.
3488</p>
3489
3490<p>
3491Because <code>recover</code> always returns <code>nil</code> unless called directly
3492from a deferred function, deferred code can call library routines that themselves
3493use <code>panic</code> and <code>recover</code> without failing. As an example,
3494the deferred function in <code>safelyDo</code> might call a logging function before
3495calling <code>recover</code>, and that logging code would run unaffected
3496by the panicking state.
3497</p>
3498
3499<p>
3500With our recovery pattern in place, the <code>do</code>
3501function (and anything it calls) can get out of any bad situation
3502cleanly by calling <code>panic</code>. We can use that idea to
3503simplify error handling in complex software. Let's look at an
3504idealized version of a <code>regexp</code> package, which reports
3505parsing errors by calling <code>panic</code> with a local
3506error type. Here's the definition of <code>Error</code>,
3507an <code>error</code> method, and the <code>Compile</code> function.
3508</p>
3509
3510<pre>
3511// Error is the type of a parse error; it satisfies the error interface.
3512type Error string
3513func (e Error) Error() string {
3514 return string(e)
3515}
3516
3517// error is a method of *Regexp that reports parsing errors by
3518// panicking with an Error.
3519func (regexp *Regexp) error(err string) {
3520 panic(Error(err))
3521}
3522
3523// Compile returns a parsed representation of the regular expression.
3524func Compile(str string) (regexp *Regexp, err error) {
3525 regexp = new(Regexp)
3526 // doParse will panic if there is a parse error.
3527 defer func() {
3528 if e := recover(); e != nil {
3529 regexp = nil // Clear return value.
3530 err = e.(Error) // Will re-panic if not a parse error.
3531 }
3532 }()
3533 return regexp.doParse(str), nil
3534}
3535</pre>
3536
3537<p>
3538If <code>doParse</code> panics, the recovery block will set the
3539return value to <code>nil</code>&mdash;deferred functions can modify
3540named return values. It will then check, in the assignment
3541to <code>err</code>, that the problem was a parse error by asserting
3542that it has the local type <code>Error</code>.
3543If it does not, the type assertion will fail, causing a run-time error
3544that continues the stack unwinding as though nothing had interrupted
3545it.
3546This check means that if something unexpected happens, such
3547as an index out of bounds, the code will fail even though we
3548are using <code>panic</code> and <code>recover</code> to handle
3549parse errors.
3550</p>
3551
3552<p>
3553With error handling in place, the <code>error</code> method (because it's a
3554method bound to a type, it's fine, even natural, for it to have the same name
3555as the builtin <code>error</code> type)
3556makes it easy to report parse errors without worrying about unwinding
3557the parse stack by hand:
3558</p>
3559
3560<pre>
3561if pos == 0 {
3562 re.error("'*' illegal at start of expression")
3563}
3564</pre>
3565
3566<p>
3567Useful though this pattern is, it should be used only within a package.
3568<code>Parse</code> turns its internal <code>panic</code> calls into
3569<code>error</code> values; it does not expose <code>panics</code>
3570to its client. That is a good rule to follow.
3571</p>
3572
3573<p>
3574By the way, this re-panic idiom changes the panic value if an actual
3575error occurs. However, both the original and new failures will be
3576presented in the crash report, so the root cause of the problem will
3577still be visible. Thus this simple re-panic approach is usually
3578sufficient&mdash;it's a crash after all&mdash;but if you want to
3579display only the original value, you can write a little more code to
3580filter unexpected problems and re-panic with the original error.
3581That's left as an exercise for the reader.
3582</p>
3583
3584
3585<h2 id="web_server">A web server</h2>
3586
3587<p>
3588Let's finish with a complete Go program, a web server.
3589This one is actually a kind of web re-server.
3590Google provides a service at
3591<a href="http://chart.apis.google.com">http://chart.apis.google.com</a>
3592that does automatic formatting of data into charts and graphs.
3593It's hard to use interactively, though,
3594because you need to put the data into the URL as a query.
3595The program here provides a nicer interface to one form of data: given a short piece of text,
3596it calls on the chart server to produce a QR code, a matrix of boxes that encode the
3597text.
3598That image can be grabbed with your cell phone's camera and interpreted as,
3599for instance, a URL, saving you typing the URL into the phone's tiny keyboard.
3600</p>
3601<p>
3602Here's the complete program.
3603An explanation follows.
3604</p>
3605{{code "/doc/progs/eff_qr.go" `/package/` `$`}}
3606<p>
3607The pieces up to <code>main</code> should be easy to follow.
3608The one flag sets a default HTTP port for our server. The template
3609variable <code>templ</code> is where the fun happens. It builds an HTML template
3610that will be executed by the server to display the page; more about
3611that in a moment.
3612</p>
3613<p>
3614The <code>main</code> function parses the flags and, using the mechanism
3615we talked about above, binds the function <code>QR</code> to the root path
3616for the server. Then <code>http.ListenAndServe</code> is called to start the
3617server; it blocks while the server runs.
3618</p>
3619<p>
3620<code>QR</code> just receives the request, which contains form data, and
3621executes the template on the data in the form value named <code>s</code>.
3622</p>
3623<p>
3624The template package <code>html/template</code> is powerful;
3625this program just touches on its capabilities.
3626In essence, it rewrites a piece of HTML text on the fly by substituting elements derived
3627from data items passed to <code>templ.Execute</code>, in this case the
3628form value.
3629Within the template text (<code>templateStr</code>),
3630double-brace-delimited pieces denote template actions.
3631The piece from <code>{{html "{{if .}}"}}</code>
3632to <code>{{html "{{end}}"}}</code> executes only if the value of the current data item, called <code>.</code> (dot),
3633is non-empty.
3634That is, when the string is empty, this piece of the template is suppressed.
3635</p>
3636<p>
3637The two snippets <code>{{html "{{.}}"}}</code> say to show the data presented to
3638the template—the query string—on the web page.
3639The HTML template package automatically provides appropriate escaping so the
3640text is safe to display.
3641</p>
3642<p>
3643The rest of the template string is just the HTML to show when the page loads.
3644If this is too quick an explanation, see the <a href="/pkg/html/template/">documentation</a>
3645for the template package for a more thorough discussion.
3646</p>
3647<p>
3648And there you have it: a useful web server in a few lines of code plus some
3649data-driven HTML text.
3650Go is powerful enough to make a lot happen in a few lines.
3651</p>
3652
3653<!--
3654TODO
3655<pre>
3656verifying implementation
3657type Color uint32
3658
3659// Check that Color implements image.Color and image.Image
3660var _ image.Color = Black
3661var _ image.Image = Black
3662</pre>
3663-->
3664