Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(707)

Side by Side Diff: doc/go_faq.html

Issue 4852041: code review 4852041: FAQ: lots of small tweaks plus a couple of new discussions. (Closed)
Patch Set: diff -r 6f83246236f3 https://go.googlecode.com/hg/ Created 13 years, 7 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <!-- FAQ --> 1 <!-- FAQ -->
2 2
3 <h2 id="Origins">Origins</h2> 3 <h2 id="Origins">Origins</h2>
4 4
5 <h3 id="What_is_the_purpose_of_the_project"> 5 <h3 id="What_is_the_purpose_of_the_project">
6 What is the purpose of the project?</h3> 6 What is the purpose of the project?</h3>
7 7
8 <p> 8 <p>
9 No major systems language has emerged in over a decade, but over that time 9 No major systems language has emerged in over a decade, but over that time
10 the computing landscape has changed tremendously. There are several trends: 10 the computing landscape has changed tremendously. There are several trends:
11 </p>
11 12
12 <ul> 13 <ul>
13 <li> 14 <li>
14 Computers are enormously quicker but software development is not faster. 15 Computers are enormously quicker but software development is not faster.
15 <li> 16 <li>
16 Dependency management is a big part of software development today but the 17 Dependency management is a big part of software development today but the
17 &ldquo;header files&rdquo; of languages in the C tradition are antithetical to c lean 18 &ldquo;header files&rdquo; of languages in the C tradition are antithetical to c lean
18 dependency analysis&mdash;and fast compilation. 19 dependency analysis&mdash;and fast compilation.
19 <li> 20 <li>
20 There is a growing rebellion against cumbersome type systems like those of 21 There is a growing rebellion against cumbersome type systems like those of
21 Java and C++, pushing people towards dynamically typed languages such as 22 Java and C++, pushing people towards dynamically typed languages such as
22 Python and JavaScript. 23 Python and JavaScript.
23 <li> 24 <li>
24 Some fundamental concepts such as garbage collection and parallel computation 25 Some fundamental concepts such as garbage collection and parallel computation
25 are not well supported by popular systems languages. 26 are not well supported by popular systems languages.
26 <li> 27 <li>
27 The emergence of multicore computers has generated worry and confusion. 28 The emergence of multicore computers has generated worry and confusion.
28 </ul> 29 </ul>
29 </p>
30 30
31 <p> 31 <p>
32 We believe it's worth trying again with a new language, a concurrent, 32 We believe it's worth trying again with a new language, a concurrent,
33 garbage-collected language with fast compilation. Regarding the points above: 33 garbage-collected language with fast compilation. Regarding the points above:
34 </p>
34 35
35 <ul> 36 <ul>
36 <li> 37 <li>
37 It is possible to compile a large Go program in a few seconds on a single comput er. 38 It is possible to compile a large Go program in a few seconds on a single comput er.
38 <li> 39 <li>
39 Go provides a model for software construction that makes dependency 40 Go provides a model for software construction that makes dependency
40 analysis easy and avoids much of the overhead of C-style include files and 41 analysis easy and avoids much of the overhead of C-style include files and
41 libraries. 42 libraries.
42 <li> 43 <li>
43 Go's type system has no hierarchy, so no time is spent defining the 44 Go's type system has no hierarchy, so no time is spent defining the
44 relationships between types. Also, although Go has static types the language 45 relationships between types. Also, although Go has static types the language
45 attempts to make types feel lighter weight than in typical OO languages. 46 attempts to make types feel lighter weight than in typical OO languages.
46 <li> 47 <li>
47 Go is fully garbage-collected and provides fundamental support for 48 Go is fully garbage-collected and provides fundamental support for
48 concurrent execution and communication. 49 concurrent execution and communication.
49 <li> 50 <li>
50 By its design, Go proposes an approach for the construction of system 51 By its design, Go proposes an approach for the construction of system
51 software on multicore machines. 52 software on multicore machines.
52 </ul> 53 </ul>
53 </p>
54 54
55 <h3 id="What_is_the_origin_of_the_name"> 55 <h3 id="What_is_the_origin_of_the_name">
56 What is the origin of the name?</h3> 56 What is the origin of the name?</h3>
57 57
58 <p> 58 <p>
59 &ldquo;Ogle&rdquo; would be a good name for a Go debugger. 59 &ldquo;Ogle&rdquo; would be a good name for a Go debugger.
60 </p> 60 </p>
61 61
62 <h3 id="Whats_the_origin_of_the_mascot"> 62 <h3 id="Whats_the_origin_of_the_mascot">
63 What's the origin of the mascot?</h3> 63 What's the origin of the mascot?</h3>
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 parallel with unrelated work. By January 2008, Ken had started work 98 parallel with unrelated work. By January 2008, Ken had started work
99 on a compiler with which to explore ideas; it generated C code as its 99 on a compiler with which to explore ideas; it generated C code as its
100 output. By mid-year the language had become a full-time project and 100 output. By mid-year the language had become a full-time project and
101 had settled enough to attempt a production compiler. In May 2008, 101 had settled enough to attempt a production compiler. In May 2008,
102 Ian Taylor independently started on a GCC front end for Go using the 102 Ian Taylor independently started on a GCC front end for Go using the
103 draft specification. Russ Cox joined in late 2008 and helped move the language 103 draft specification. Russ Cox joined in late 2008 and helped move the language
104 and libraries from prototype to reality. 104 and libraries from prototype to reality.
105 </p> 105 </p>
106 106
107 <p> 107 <p>
108 Many others have contributed ideas, discussions, and code. 108 Go became a public open source project on November 10, 2009.
109 Many people from the community have contributed ideas, discussions, and code.
109 </p> 110 </p>
110 111
111 <h3 id="creating_a_new_language"> 112 <h3 id="creating_a_new_language">
112 Why are you creating a new language?</h3> 113 Why are you creating a new language?</h3>
113 <p> 114 <p>
114 Go was born out of frustration with existing languages and 115 Go was born out of frustration with existing languages and
115 environments for systems programming. Programming had become too 116 environments for systems programming. Programming had become too
116 difficult and the choice of languages was partly to blame. One had to 117 difficult and the choice of languages was partly to blame. One had to
117 choose either efficient compilation, efficient execution, or ease of 118 choose either efficient compilation, efficient execution, or ease of
118 programming; all three were not available in the same mainstream 119 programming; all three were not available in the same mainstream
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 Why does Go not have exceptions?</h3> 308 Why does Go not have exceptions?</h3>
308 <p> 309 <p>
309 We believe that coupling exceptions to a control 310 We believe that coupling exceptions to a control
310 structure, as in the <code>try-catch-finally</code> idiom, results in 311 structure, as in the <code>try-catch-finally</code> idiom, results in
311 convoluted code. It also tends to encourage programmers to label 312 convoluted code. It also tends to encourage programmers to label
312 too many ordinary errors, such as failing to open a file, as 313 too many ordinary errors, such as failing to open a file, as
313 exceptional. 314 exceptional.
314 </p> 315 </p>
315 316
316 <p> 317 <p>
317 Go takes a different approach. Instead of exceptions, it has a couple 318 Go takes a different approach. For plain error handling, Go's multi-value
319 returns make it easy to report an error without overloading the return value.
320 <a href="http://blog.golang.org/2011/07/error-handling-and-go.html">A
321 canonical error type, coupled
322 with Go's other features</a>, makes error
323 handling pleasant but quite different from that in other languages.
324 </p>
325
326 <p>
327 Go also has a couple
318 of built-in functions to signal and recover from truly exceptional 328 of built-in functions to signal and recover from truly exceptional
319 conditions. The recovery mechanism is executed only as part of a 329 conditions. The recovery mechanism is executed only as part of a
320 function's state being torn down after an error, which is sufficient 330 function's state being torn down after an error, which is sufficient
321 to handle catastrophe but requires no extra control structures and, 331 to handle catastrophe but requires no extra control structures and,
322 when used well, can result in clean error-handling code. 332 when used well, can result in clean error-handling code.
323 </p> 333 </p>
324 334
325 <p> 335 <p>
326 See the <a href="http://blog.golang.org/2010/08/defer-panic-and-recover.html">De fer, Panic, and Recover</a> article for details. 336 See the <a href="http://blog.golang.org/2010/08/defer-panic-and-recover.html">De fer, Panic, and Recover</a> article for details.
327 </p> 337 </p>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 the Go language and libraries that differ from modern practices, simply 375 the Go language and libraries that differ from modern practices, simply
366 because we feel it's sometimes worth trying a different approach. 376 because we feel it's sometimes worth trying a different approach.
367 </p> 377 </p>
368 378
369 <h3 id="csp"> 379 <h3 id="csp">
370 Why build concurrency on the ideas of CSP?</h3> 380 Why build concurrency on the ideas of CSP?</h3>
371 <p> 381 <p>
372 Concurrency and multi-threaded programming have a reputation 382 Concurrency and multi-threaded programming have a reputation
373 for difficulty. We believe the problem is due partly to complex 383 for difficulty. We believe the problem is due partly to complex
374 designs such as pthreads and partly to overemphasis on low-level details 384 designs such as pthreads and partly to overemphasis on low-level details
375 such as mutexes, condition variables, and even memory barriers. 385 such as mutexes, condition variables, and memory barriers.
376 Higher-level interfaces enable much simpler code, even if there are still 386 Higher-level interfaces enable much simpler code, even if there are still
377 mutexes and such under the covers. 387 mutexes and such under the covers.
378 </p> 388 </p>
379 389
380 <p> 390 <p>
381 One of the most successful models for providing high-level linguistic support 391 One of the most successful models for providing high-level linguistic support
382 for concurrency comes from Hoare's Communicating Sequential Processes, or CSP. 392 for concurrency comes from Hoare's Communicating Sequential Processes, or CSP.
383 Occam and Erlang are two well known languages that stem from CSP. 393 Occam and Erlang are two well known languages that stem from CSP.
384 Go's concurrency primitives derive from a different part of the family tree 394 Go's concurrency primitives derive from a different part of the family tree
385 whose main contribution is the powerful notion of channels as first class object s. 395 whose main contribution is the powerful notion of channels as first class object s.
386 </p> 396 </p>
387 397
388 <h3 id="goroutines"> 398 <h3 id="goroutines">
389 Why goroutines instead of threads?</h3> 399 Why goroutines instead of threads?</h3>
390 <p> 400 <p>
391 Goroutines are part of making concurrency easy to use. The idea, which has 401 Goroutines are part of making concurrency easy to use. The idea, which has
392 been around for a while, is to multiplex independently executing 402 been around for a while, is to multiplex independently executing
393 functions&mdash;coroutines, really&mdash;onto a set of threads. 403 functions&mdash;coroutines&mdash;onto a set of threads.
394 When a coroutine blocks, such as by calling a blocking system call, 404 When a coroutine blocks, such as by calling a blocking system call,
395 the run-time automatically moves other coroutines on the same operating 405 the run-time automatically moves other coroutines on the same operating
396 system thread to a different, runnable thread so they won't be blocked. 406 system thread to a different, runnable thread so they won't be blocked.
397 The programmer sees none of this, which is the point. 407 The programmer sees none of this, which is the point.
398 The result, which we call goroutines, can be very cheap: unless they spend a lot of time 408 The result, which we call goroutines, can be very cheap: unless they spend a lot of time
399 in long-running system calls, they cost little more than the memory 409 in long-running system calls, they cost little more than the memory
400 for the stack. 410 for the stack, which is just a few kilobytes.
401 </p> 411 </p>
402 412
403 <p> 413 <p>
404 To make the stacks small, Go's run-time uses segmented stacks. A newly 414 To make the stacks small, Go's run-time uses segmented stacks. A newly
405 minted goroutine is given a few kilobytes, which is almost always enough. 415 minted goroutine is given a few kilobytes, which is almost always enough.
406 When it isn't, the run-time allocates (and frees) extension segments automatical ly. 416 When it isn't, the run-time allocates (and frees) extension segments automatical ly.
407 The overhead averages about three cheap instructions per function call. 417 The overhead averages about three cheap instructions per function call.
408 It is practical to create hundreds of thousands of goroutines in the same 418 It is practical to create hundreds of thousands of goroutines in the same
409 address space. If goroutines were just threads, system resources would 419 address space. If goroutines were just threads, system resources would
410 run out at a much smaller number. 420 run out at a much smaller number.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 different approach. 476 different approach.
467 </p> 477 </p>
468 478
469 <p> 479 <p>
470 Rather than requiring the programmer to declare ahead of time that two 480 Rather than requiring the programmer to declare ahead of time that two
471 types are related, in Go a type automatically satisfies any interface 481 types are related, in Go a type automatically satisfies any interface
472 that specifies a subset of its methods. Besides reducing the 482 that specifies a subset of its methods. Besides reducing the
473 bookkeeping, this approach has real advantages. Types can satisfy 483 bookkeeping, this approach has real advantages. Types can satisfy
474 many interfaces at once, without the complexities of traditional 484 many interfaces at once, without the complexities of traditional
475 multiple inheritance. 485 multiple inheritance.
476 Interfaces can be very lightweight&mdash;having one or even zero methods 486 Interfaces can be very lightweight&mdash;an interface with
477 in an interface can express useful concepts. 487 one or even zero methods can express a useful concept.
478 Interfaces can be added after the fact if a new idea comes along 488 Interfaces can be added after the fact if a new idea comes along
479 or for testing&mdash;without annotating the original types. 489 or for testing&mdash;without annotating the original types.
480 Because there are no explicit relationships between types 490 Because there are no explicit relationships between types
481 and interfaces, there is no type hierarchy to manage or discuss. 491 and interfaces, there is no type hierarchy to manage or discuss.
482 </p> 492 </p>
483 493
484 <p> 494 <p>
485 It's possible to use these ideas to construct something analogous to 495 It's possible to use these ideas to construct something analogous to
486 type-safe Unix pipes. For instance, see how <code>fmt.Fprintf</code> 496 type-safe Unix pipes. For instance, see how <code>fmt.Fprintf</code>
487 enables formatted printing to any output, not just a file, or how the 497 enables formatted printing to any output, not just a file, or how the
488 <code>bufio</code> package can be completely separate from file I/O, 498 <code>bufio</code> package can be completely separate from file I/O,
489 or how the <code>crypto</code> packages stitch together block and 499 or how the <code>crypto</code> packages stitch together block and
490 stream ciphers. All these ideas stem from a single interface 500 stream ciphers. All these ideas stem from a single interface
491 (<code>io.Writer</code>) representing a single method 501 (<code>io.Writer</code>) representing a single method
492 (<code>Write</code>). And that's only scratching the surface. 502 (<code>Write</code>). And that's only scratching the surface.
493 </p> 503 </p>
494 504
495 <p> 505 <p>
496 It takes some getting used to but this implicit style of type 506 It takes some getting used to but this implicit style of type
497 dependency is one of the most exciting things about Go. 507 dependency is one of the most productive things about Go.
498 </p> 508 </p>
499 509
500 <h3 id="methods_on_basics"> 510 <h3 id="methods_on_basics">
501 Why is <code>len</code> a function and not a method?</h3> 511 Why is <code>len</code> a function and not a method?</h3>
502 <p> 512 <p>
503 We debated this issue but decided 513 We debated this issue but decided
504 implementing <code>len</code> and friends as functions was fine in practice and 514 implementing <code>len</code> and friends as functions was fine in practice and
505 didn't complicate questions about the interface (in the Go type sense) 515 didn't complicate questions about the interface (in the Go type sense)
506 of basic types. 516 of basic types.
507 </p> 517 </p>
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 func (b Bar) ImplementsFooer() {} 591 func (b Bar) ImplementsFooer() {}
582 func (b Bar) Foo() {} 592 func (b Bar) Foo() {}
583 </pre> 593 </pre>
584 594
585 <p> 595 <p>
586 Most code doesn't make use of such constraints, since they limit the utility of· 596 Most code doesn't make use of such constraints, since they limit the utility of·
587 the interface idea. Sometimes, though, they're necessary to resolve ambiguities 597 the interface idea. Sometimes, though, they're necessary to resolve ambiguities
588 among similar interfaces. 598 among similar interfaces.
589 </p> 599 </p>
590 600
601 <h3 id="t_and_equal_interface">
602 Why doesn't type T satisfy the Equal interface?</h3>
603
604 <p>
605 Consider this simple interface to represent an object that can compare
606 itself with another value:
607 </p>
608
609 <pre>
610 type Equaler interface {
611 Equal(Equaler) bool
612 }
613 </pre>
614
615 <p>
616 and this type, <code>T</code>:
617 </p>
618
619 <pre>
620 type T int
621 func (t T) Equal(u T) bool { return t == u } // does not satisfy Equaler
622 </pre>
623
624 <p>
625 Unlike the analogous situation in some object-oriented type systems,
rsc 2011/08/05 21:35:34 s/the/an/ s/object-oriented/polymorphic/
626 <code>T</code> does not implement <code>Equaler</code>.
627 The argument type of <code>T.Equal</code> is <code>T</code>,
628 not literally the required type <code>Equaler</code>.
629 </p>
630
631 <p>
632 In Go, the type system does not promote the argument of
633 <code>Equal</code>; that is the programmer's responsibility, as
634 illustrated by the type <code>T2</code>, which does implement
635 <code>Equaler</code>:
636 </p>
637
638 <pre>
639 type T2 int
640 func (t T2) Equal(u Equaler) bool { return t == u.(T2) } // satisfies Equaler
641 </pre>
642
643 <p>
644 Even this isn't like other type systems, though, because in Go <em>any</em>
645 type that satisfies <code>Equaler</code> could be passed as the
646 argument to <code>T2.Equal</code>, and at run time we must
647 check that the argument is of type <code>T2</code>.
648 Some languages arrange to make that guarantee at compile time.
649 </p>
650
651 <p>
652 A related example goes the other way:
653 </p>
654
655 <pre>
656 type Opener interface {
657 Open(name) Reader
658 }
659
660 func (t T3) Open() *os.File
661 </pre>
662
663 <p>
664 In Go, <code>T3</code> does not satisfy <code>Opener</code>,
665 although it might in another language.
666 </p>
667
668 <p>
669 While it is true that Go's type system does less for the programmer
670 in such cases, the lack of subtype inheritance makes the rules about
rsc 2011/08/05 21:35:34 s/subtype inheritance/subtyping/
671 interface satisfaction very easy to state: are the function's names
672 and signatures exactly those of the interface?
673 Go's rule is also easy to implement efficiently.
674 We feel these benefits offset the lack of
675 automatic type promotion. Should Go one day adopt some form of generic
676 typing, we expect there would be a way to express the idea of these
677 examples and also have them be statically checked.
678 </p>
679
591 <h3 id="convert_slice_of_interface"> 680 <h3 id="convert_slice_of_interface">
592 Can I convert a []T to an []interface{}?</h3> 681 Can I convert a []T to an []interface{}?</h3>
593 682
594 <p> 683 <p>
595 Not directly because they do not have the same representation in memory. 684 Not directly because they do not have the same representation in memory.
596 It is necessary to copy the elements individually to the destination 685 It is necessary to copy the elements individually to the destination
597 slice. This example converts a slice of <code>int</code> to a slice of 686 slice. This example converts a slice of <code>int</code> to a slice of
598 <code>interface{}</code>: 687 <code>interface{}</code>:
599 </p> 688 </p>
600 689
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 makes a copy of the thing stored in the interface value. If the interface 818 makes a copy of the thing stored in the interface value. If the interface
730 value holds a struct, copying the interface value makes a copy of the 819 value holds a struct, copying the interface value makes a copy of the
731 struct. If the interface value holds a pointer, copying the interface value 820 struct. If the interface value holds a pointer, copying the interface value
732 makes a copy of the pointer, but again not the data it points to.· 821 makes a copy of the pointer, but again not the data it points to.·
733 </p> 822 </p>
734 823
735 <h3 id="methods_on_values_or_pointers"> 824 <h3 id="methods_on_values_or_pointers">
736 Should I define methods on values or pointers?</h3> 825 Should I define methods on values or pointers?</h3>
737 826
738 <pre> 827 <pre>
739 func (s *MyStruct) someMethod() { } // method on pointer 828 func (s *MyStruct) pointerMethod() { } // method on pointer
740 func (s MyStruct) someMethod() { } // method on value 829 func (s MyStruct) valueMethod() { } // method on value
741 </pre> 830 </pre>
742 831
743 <p> 832 <p>
833 For programmers unaccustomed to pointers, the distinction between these
834 two examples can be confusing, but the situation is actually very simple.
744 When defining a method on a type, the receiver (<code>s</code> in the above 835 When defining a method on a type, the receiver (<code>s</code> in the above
745 example) behaves exactly is if it were an argument to the method. Define the 836 example) behaves exactly as if it were an argument to the method.
746 method on a pointer type if you need the method to modify the data the receiver 837 Whether to define the receiver as a value or as a pointer is the same
747 points to. Otherwise, it is often cleaner to define the method on a value type. 838 question, then, as whether a function argument should be a value or
839 a pointer.
840 There are several considerations.
748 </p> 841 </p>
749 842
843 <p>
844 First, and most important, does the method need to modify the
845 receiver?
846 If it does, the receiver <em>must</em> be a pointer.
847 (Slices and maps are reference types, so their story is a little
848 more subtle, but for instance to change the length of a slice
849 in a method the receiver must still be a pointer.)
850 In the examples
851 above, if <code>pointerMethod</code> modifies the fields of <code>s</code>,
852 the caller will see those changes, but <code>valueMethod</code> is called
853 with a copy of the caller's argument (that's the definition of passing a value),
854 so changes it makes will be invisible to the caller.
855 (By the way, pointer receivers are identical to the situation in Java, although
856 in Java the pointers are hidden under the covers; it's Go's value receivers that
857 are unusual.)
858 </p>
859
860 <p>
861 Second is the consideration of efficiency. If the receiver is large, a big <code >struct</code>
862 for instance, it will be much cheaper to use a pointer receiver.
863 </p>
864
865 <p>
866 Next is consistency. If some of the methods of the type must have
867 pointer receivers, the rest should too, so the method set is
868 consistent regardless of how the type is used.
869 See the section on <a href="#different_method_sets">method sets</a> for details.
870 </p>
871
872 <p>
873 For other types, such as basic types, slices, and small <code>structs</code>,
874 a value receiver is very cheap so unless
875 the semantics of the method requires a pointer, a value receiver is efficient an d clear.
876 </p>
877
878
750 <h3 id="new_and_make"> 879 <h3 id="new_and_make">
751 What's the difference between new and make?</h3> 880 What's the difference between new and make?</h3>
752 881
753 <p> 882 <p>
754 In short: <code>new</code> allocates memory, <code>make</code> initializes 883 In short: <code>new</code> allocates memory, <code>make</code> initializes
755 the slice, map, and channel types. 884 the slice, map, and channel types.
756 </p> 885 </p>
757 886
758 <p> 887 <p>
759 See the <a href="/doc/effective_go.html#allocation_new">relevant section 888 See the <a href="/doc/effective_go.html#allocation_new">relevant section
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 indicate. 1233 indicate.
1105 </p> 1234 </p>
1106 1235
1107 <p> 1236 <p>
1108 Still, there is room for improvement. The compilers are good but could be 1237 Still, there is room for improvement. The compilers are good but could be
1109 better, many libraries need major performance work, and the garbage collector 1238 better, many libraries need major performance work, and the garbage collector
1110 isn't fast enough yet (even if it were, taking care not to generate unnecessary· 1239 isn't fast enough yet (even if it were, taking care not to generate unnecessary·
1111 garbage can have a huge effect). 1240 garbage can have a huge effect).
1112 </p> 1241 </p>
1113 1242
1243 <p>
1244 In any case, Go can often be very competitive. See the blog post about
1245 <a href="http://blog.golang.org/2011/06/profiling-go-programs.html">profiling
1246 Go programs</a> for an informative example.
1247
1114 <h2 id="change_from_c">Changes from C</h2> 1248 <h2 id="change_from_c">Changes from C</h2>
1115 1249
1116 <h3 id="different_syntax"> 1250 <h3 id="different_syntax">
1117 Why is the syntax so different from C?</h3> 1251 Why is the syntax so different from C?</h3>
1118 <p> 1252 <p>
1119 Other than declaration syntax, the differences are not major and stem 1253 Other than declaration syntax, the differences are not major and stem
1120 from two desires. First, the syntax should feel light, without too 1254 from two desires. First, the syntax should feel light, without too
1121 many mandatory keywords, repetition, or arcana. Second, the language 1255 many mandatory keywords, repetition, or arcana. Second, the language
1122 has been designed to be easy to analyze 1256 has been designed to be easy to analyze
1123 and can be parsed without a symbol table. This makes it much easier 1257 and can be parsed without a symbol table. This makes it much easier
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 <pre> 1292 <pre>
1159 a := uint64(1); 1293 a := uint64(1);
1160 </pre> 1294 </pre>
1161 <p> 1295 <p>
1162 Parsing is also simplified by having a distinct grammar for types that 1296 Parsing is also simplified by having a distinct grammar for types that
1163 is not just the expression grammar; keywords such as <code>func</code> 1297 is not just the expression grammar; keywords such as <code>func</code>
1164 and <code>chan</code> keep things clear. 1298 and <code>chan</code> keep things clear.
1165 </p> 1299 </p>
1166 1300
1167 <p> 1301 <p>
1168 See the <a href="http://blog.golang.org/2010/07/gos-declaration-syntax.html">Go' s Declaration Syntax</a> article for more details. 1302 See the article about
1303 <a href="http://blog.golang.org/2010/07/gos-declaration-syntax.html">Go's Declar ation Syntax</a>
1304 for more details.
1169 </p> 1305 </p>
1170 1306
1171 <h3 id="no_pointer_arithmetic"> 1307 <h3 id="no_pointer_arithmetic">
1172 Why is there no pointer arithmetic?</h3> 1308 Why is there no pointer arithmetic?</h3>
1173 <p> 1309 <p>
1174 Safety. Without pointer arithmetic it's possible to create a 1310 Safety. Without pointer arithmetic it's possible to create a
1175 language that can never derive an illegal address that succeeds 1311 language that can never derive an illegal address that succeeds
1176 incorrectly. Compiler and hardware technology have advanced to the 1312 incorrectly. Compiler and hardware technology have advanced to the
1177 point where a loop using array indices can be as efficient as a loop 1313 point where a loop using array indices can be as efficient as a loop
1178 using pointer arithmetic. Also, the lack of pointer arithmetic can 1314 using pointer arithmetic. Also, the lack of pointer arithmetic can
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 Automatic garbage collection makes concurrent code far easier to write. 1381 Automatic garbage collection makes concurrent code far easier to write.
1246 Of course, implementing garbage collection in a concurrent environment is 1382 Of course, implementing garbage collection in a concurrent environment is
1247 itself a challenge, but meeting it once rather than in every 1383 itself a challenge, but meeting it once rather than in every
1248 program helps everyone. 1384 program helps everyone.
1249 </p> 1385 </p>
1250 1386
1251 <p> 1387 <p>
1252 Finally, concurrency aside, garbage collection makes interfaces 1388 Finally, concurrency aside, garbage collection makes interfaces
1253 simpler because they don't need to specify how memory is managed across them. 1389 simpler because they don't need to specify how memory is managed across them.
1254 </p> 1390 </p>
1391
1392 <p>
1393 On the topic of performance, keep in mind that Go gives the programmer
1394 considerable control over memory layout and allocation, much more than
1395 is typical in garbage-collected languages. A careful programmer can reduce
1396 the garbage collection overhead dramatically by using the language well;
1397 see the article about
1398 <a href="http://blog.golang.org/2011/06/profiling-go-programs.html">profiling
1399 Go programs</a> for a worked example, including a demonstration of Go's
1400 profiling tools.
1401 </p>
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b