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