Andrew Gerrand | 7cb21a7 | 2012-01-19 11:24:54 +1100 | [diff] [blame] | 1 | <!--{ |
Andrew Gerrand | 5dd7417 | 2013-09-16 15:47:13 +1000 | [diff] [blame] | 2 | "Title": "Frequently Asked Questions (FAQ)", |
Russ Cox | 10ea651 | 2012-09-24 20:57:01 -0400 | [diff] [blame] | 3 | "Path": "/doc/faq" |
Andrew Gerrand | 7cb21a7 | 2012-01-19 11:24:54 +1100 | [diff] [blame] | 4 | }--> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 5 | |
| 6 | <h2 id="Origins">Origins</h2> |
| 7 | |
| 8 | <h3 id="What_is_the_purpose_of_the_project"> |
| 9 | What is the purpose of the project?</h3> |
| 10 | |
| 11 | <p> |
| 12 | No major systems language has emerged in over a decade, but over that time |
| 13 | the computing landscape has changed tremendously. There are several trends: |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 14 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 15 | |
| 16 | <ul> |
| 17 | <li> |
| 18 | Computers are enormously quicker but software development is not faster. |
| 19 | <li> |
| 20 | Dependency management is a big part of software development today but the |
Russ Cox | e434f1a | 2009-11-07 17:31:22 -0800 | [diff] [blame] | 21 | “header files” of languages in the C tradition are antithetical to clean |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 22 | dependency analysis—and fast compilation. |
| 23 | <li> |
| 24 | There is a growing rebellion against cumbersome type systems like those of |
| 25 | Java and C++, pushing people towards dynamically typed languages such as |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 26 | Python and JavaScript. |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 27 | <li> |
| 28 | Some fundamental concepts such as garbage collection and parallel computation |
| 29 | are not well supported by popular systems languages. |
| 30 | <li> |
| 31 | The emergence of multicore computers has generated worry and confusion. |
| 32 | </ul> |
| 33 | |
| 34 | <p> |
| 35 | We believe it's worth trying again with a new language, a concurrent, |
| 36 | garbage-collected language with fast compilation. Regarding the points above: |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 37 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 38 | |
| 39 | <ul> |
| 40 | <li> |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 41 | It is possible to compile a large Go program in a few seconds on a single computer. |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 42 | <li> |
| 43 | Go provides a model for software construction that makes dependency |
| 44 | analysis easy and avoids much of the overhead of C-style include files and |
| 45 | libraries. |
| 46 | <li> |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 47 | Go's type system has no hierarchy, so no time is spent defining the |
| 48 | relationships between types. Also, although Go has static types the language |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 49 | attempts to make types feel lighter weight than in typical OO languages. |
| 50 | <li> |
| 51 | Go is fully garbage-collected and provides fundamental support for |
| 52 | concurrent execution and communication. |
| 53 | <li> |
| 54 | By its design, Go proposes an approach for the construction of system |
| 55 | software on multicore machines. |
| 56 | </ul> |
| 57 | |
Rob Pike | 0d5bc0c | 2013-08-20 06:44:41 +1000 | [diff] [blame] | 58 | <p> |
| 59 | A much more expansive answer to this question is available in the article, |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 60 | <a href="//talks.golang.org/2012/splash.article">Go at Google: |
Rob Pike | 0d5bc0c | 2013-08-20 06:44:41 +1000 | [diff] [blame] | 61 | Language Design in the Service of Software Engineering</a>. |
| 62 | |
Rob Pike | 8de5080 | 2012-07-16 13:31:15 -0700 | [diff] [blame] | 63 | <h3 id="What_is_the_status_of_the_project"> |
| 64 | What is the status of the project?</h3> |
| 65 | |
| 66 | <p> |
| 67 | Go became a public open source project on November 10, 2009. |
| 68 | After a couple of years of very active design and development, stability was called for and |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 69 | Go 1 was <a href="//blog.golang.org/2012/03/go-version-1-is-released.html">released</a> |
Rob Pike | 8de5080 | 2012-07-16 13:31:15 -0700 | [diff] [blame] | 70 | on March 28, 2012. |
Andrew Gerrand | 48ba6fe | 2013-10-04 09:45:06 +1000 | [diff] [blame] | 71 | Go 1, which includes a <a href="/ref/spec">language specification</a>, |
Rob Pike | 8de5080 | 2012-07-16 13:31:15 -0700 | [diff] [blame] | 72 | <a href="/pkg/">standard libraries</a>, |
| 73 | and <a href="/cmd/go/">custom tools</a>, |
| 74 | provides a stable foundation for creating reliable products, projects, and publications. |
| 75 | </p> |
| 76 | |
| 77 | <p> |
| 78 | With that stability established, we are using Go to develop programs, products, and tools rather than |
| 79 | actively changing the language and libraries. |
| 80 | In fact, the purpose of Go 1 is to provide <a href="/doc/go1compat.html">long-term stability</a>. |
| 81 | Backwards-incompatible changes will not be made to any Go 1 point release. |
| 82 | We want to use what we have to learn how a future version of Go might look, rather than to play with |
| 83 | the language underfoot. |
| 84 | </p> |
| 85 | |
| 86 | <p> |
| 87 | Of course, development will continue on Go itself, but the focus will be on performance, reliability, |
| 88 | portability and the addition of new functionality such as improved support for internationalization. |
| 89 | </p> |
| 90 | |
| 91 | <p> |
| 92 | There may well be a Go 2 one day, but not for a few years and it will be influenced by what we learn using Go 1 as it is today. |
| 93 | </p> |
| 94 | |
Rob Pike | bdecae9 | 2009-11-23 17:34:23 -0800 | [diff] [blame] | 95 | <h3 id="Whats_the_origin_of_the_mascot"> |
| 96 | What's the origin of the mascot?</h3> |
| 97 | |
| 98 | <p> |
| 99 | The mascot and logo were designed by |
| 100 | <a href="http://reneefrench.blogspot.com">Renée French</a>, who also designed |
Andrew Gerrand | 39304eb | 2016-02-05 09:43:46 +1100 | [diff] [blame] | 101 | <a href="https://9p.io/plan9/glenda.html">Glenda</a>, |
Rob Pike | bdecae9 | 2009-11-23 17:34:23 -0800 | [diff] [blame] | 102 | the Plan 9 bunny. |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 103 | The <a href="https://blog.golang.org/gopher">gopher</a> |
| 104 | is derived from one she used for an <a href="http://wfmu.org/">WFMU</a> |
Rob Pike | bdecae9 | 2009-11-23 17:34:23 -0800 | [diff] [blame] | 105 | T-shirt design some years ago. |
| 106 | The logo and mascot are covered by the |
| 107 | <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> |
| 108 | license. |
| 109 | </p> |
| 110 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 111 | <h3 id="history"> |
| 112 | What is the history of the project?</h3> |
| 113 | <p> |
| 114 | Robert Griesemer, Rob Pike and Ken Thompson started sketching the |
| 115 | goals for a new language on the white board on September 21, 2007. |
| 116 | Within a few days the goals had settled into a plan to do something |
| 117 | and a fair idea of what it would be. Design continued part-time in |
| 118 | parallel with unrelated work. By January 2008, Ken had started work |
| 119 | on a compiler with which to explore ideas; it generated C code as its |
| 120 | output. By mid-year the language had become a full-time project and |
| 121 | had settled enough to attempt a production compiler. In May 2008, |
| 122 | Ian Taylor independently started on a GCC front end for Go using the |
| 123 | draft specification. Russ Cox joined in late 2008 and helped move the language |
| 124 | and libraries from prototype to reality. |
| 125 | </p> |
| 126 | |
| 127 | <p> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 128 | Go became a public open source project on November 10, 2009. |
| 129 | Many people from the community have contributed ideas, discussions, and code. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 130 | </p> |
| 131 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 132 | <h3 id="creating_a_new_language"> |
| 133 | Why are you creating a new language?</h3> |
| 134 | <p> |
| 135 | Go was born out of frustration with existing languages and |
| 136 | environments for systems programming. Programming had become too |
| 137 | difficult and the choice of languages was partly to blame. One had to |
| 138 | choose either efficient compilation, efficient execution, or ease of |
| 139 | programming; all three were not available in the same mainstream |
| 140 | language. Programmers who could were choosing ease over |
| 141 | safety and efficiency by moving to dynamically typed languages such as |
| 142 | Python and JavaScript rather than C++ or, to a lesser extent, Java. |
| 143 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 144 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 145 | <p> |
| 146 | Go is an attempt to combine the ease of programming of an interpreted, |
| 147 | dynamically typed |
| 148 | language with the efficiency and safety of a statically typed, compiled language. |
| 149 | It also aims to be modern, with support for networked and multicore |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 150 | computing. Finally, working with Go is intended to be <i>fast</i>: it should take |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 151 | at most a few seconds to build a large executable on a single computer. |
| 152 | To meet these goals required addressing a number of |
| 153 | linguistic issues: an expressive but lightweight type system; |
| 154 | concurrency and garbage collection; rigid dependency specification; |
| 155 | and so on. These cannot be addressed well by libraries or tools; a new |
| 156 | language was called for. |
| 157 | </p> |
| 158 | |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 159 | <p> |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 160 | The article <a href="//talks.golang.org/2012/splash.article">Go at Google</a> |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 161 | discusses the background and motivation behind the design of the Go language, |
| 162 | as well as providing more detail about many of the answers presented in this FAQ. |
| 163 | </p> |
| 164 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 165 | <h3 id="ancestors"> |
| 166 | What are Go's ancestors?</h3> |
| 167 | <p> |
| 168 | Go is mostly in the C family (basic syntax), |
| 169 | with significant input from the Pascal/Modula/Oberon |
| 170 | family (declarations, packages), |
| 171 | plus some ideas from languages |
| 172 | inspired by Tony Hoare's CSP, |
| 173 | such as Newsqueak and Limbo (concurrency). |
| 174 | However, it is a new language across the board. |
| 175 | In every respect the language was designed by thinking |
| 176 | about what programmers do and how to make programming, at least the |
| 177 | kind of programming we do, more effective, which means more fun. |
| 178 | </p> |
| 179 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 180 | <h3 id="principles"> |
| 181 | What are the guiding principles in the design?</h3> |
| 182 | <p> |
| 183 | Programming today involves too much bookkeeping, repetition, and |
| 184 | clerical work. As Dick Gabriel says, “Old programs read |
| 185 | like quiet conversations between a well-spoken research worker and a |
| 186 | well-studied mechanical colleague, not as a debate with a compiler. |
| 187 | Who'd have guessed sophistication bought such noise?” |
| 188 | The sophistication is worthwhile—no one wants to go back to |
| 189 | the old languages—but can it be more quietly achieved? |
| 190 | </p> |
| 191 | <p> |
| 192 | Go attempts to reduce the amount of typing in both senses of the word. |
| 193 | Throughout its design, we have tried to reduce clutter and |
| 194 | complexity. There are no forward declarations and no header files; |
| 195 | everything is declared exactly once. Initialization is expressive, |
| 196 | automatic, and easy to use. Syntax is clean and light on keywords. |
| 197 | Stuttering (<code>foo.Foo* myFoo = new(foo.Foo)</code>) is reduced by |
| 198 | simple type derivation using the <code>:=</code> |
| 199 | declare-and-initialize construct. And perhaps most radically, there |
| 200 | is no type hierarchy: types just <i>are</i>, they don't have to |
| 201 | announce their relationships. These simplifications allow Go to be |
| 202 | expressive yet comprehensible without sacrificing, well, sophistication. |
| 203 | </p> |
| 204 | <p> |
| 205 | Another important principle is to keep the concepts orthogonal. |
| 206 | Methods can be implemented for any type; structures represent data while |
| 207 | interfaces represent abstraction; and so on. Orthogonality makes it |
| 208 | easier to understand what happens when things combine. |
| 209 | </p> |
| 210 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 211 | <h2 id="Usage">Usage</h2> |
| 212 | |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 213 | <h3 id="Is_Google_using_go_internally"> Is Google using Go internally?</h3> |
Rob Pike | 7685a67 | 2009-11-09 20:25:45 -0800 | [diff] [blame] | 214 | |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 215 | <p> |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 216 | Yes. There are now several Go programs deployed in |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 217 | production inside Google. A public example is the server behind |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 218 | <a href="//golang.org">golang.org</a>. |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 219 | It's just the <a href="/cmd/godoc"><code>godoc</code></a> |
| 220 | document server running in a production configuration on |
Dave Cheney | 82cbcb0 | 2012-07-11 09:41:08 -0700 | [diff] [blame] | 221 | <a href="https://developers.google.com/appengine/">Google App Engine</a>. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 222 | </p> |
Rob Pike | 7685a67 | 2009-11-09 20:25:45 -0800 | [diff] [blame] | 223 | |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 224 | <p> |
Emil Hessman | f3de217 | 2014-12-30 06:45:24 +0100 | [diff] [blame] | 225 | Other examples include the <a href="//github.com/youtube/vitess/">Vitess</a> |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 226 | system for large-scale SQL installations and Google's download server, <code>dl.google.com</code>, |
| 227 | which delivers Chrome binaries and other large installables such as <code>apt-get</code> |
| 228 | packages. |
| 229 | </p> |
| 230 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 231 | <h3 id="Do_Go_programs_link_with_Cpp_programs"> |
| 232 | Do Go programs link with C/C++ programs?</h3> |
| 233 | |
| 234 | <p> |
Andrew Gerrand | 2a5879d | 2012-03-20 13:50:05 +1100 | [diff] [blame] | 235 | There are two Go compiler implementations, <code>gc</code> |
Aaron Jacobs | 8628688 | 2015-06-24 09:50:12 +1000 | [diff] [blame] | 236 | and <code>gccgo</code>. |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 237 | <code>Gc</code> uses a different calling convention and linker and can |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 238 | therefore only be linked with C programs using the same convention. |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 239 | There is such a C compiler but no C++ compiler. |
| 240 | <code>Gccgo</code> is a GCC front-end that can, with care, be linked with |
| 241 | GCC-compiled C or C++ programs. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 242 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 243 | |
| 244 | <p> |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 245 | The <a href="/cmd/cgo/">cgo</a> program provides the mechanism for a |
| 246 | “foreign function interface” to allow safe calling of |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 247 | C libraries from Go code. SWIG extends this capability to C++ libraries. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 248 | </p> |
| 249 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 250 | |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 251 | <h3 id="Does_Go_support_Google_protocol_buffers"> |
| 252 | Does Go support Google's protocol buffers?</h3> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 253 | |
| 254 | <p> |
Rob Pike | 6b3031b | 2010-03-23 17:03:28 -0700 | [diff] [blame] | 255 | A separate open source project provides the necessary compiler plugin and library. |
| 256 | It is available at |
Emil Hessman | f3de217 | 2014-12-30 06:45:24 +0100 | [diff] [blame] | 257 | <a href="//github.com/golang/protobuf">github.com/golang/protobuf/</a> |
Rob Pike | 6b3031b | 2010-03-23 17:03:28 -0700 | [diff] [blame] | 258 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 259 | |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 260 | |
Russ Cox | 6301fb4 | 2009-12-03 17:23:33 -0800 | [diff] [blame] | 261 | <h3 id="Can_I_translate_the_Go_home_page"> |
| 262 | Can I translate the Go home page into another language?</h3> |
| 263 | |
| 264 | <p> |
| 265 | Absolutely. We encourage developers to make Go Language sites in their own languages. |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 266 | However, if you choose to add the Google logo or branding to your site |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 267 | (it does not appear on <a href="//golang.org/">golang.org</a>), |
Russ Cox | 6301fb4 | 2009-12-03 17:23:33 -0800 | [diff] [blame] | 268 | you will need to abide by the guidelines at |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 269 | <a href="//www.google.com/permissions/guidelines.html">www.google.com/permissions/guidelines.html</a> |
Russ Cox | 6301fb4 | 2009-12-03 17:23:33 -0800 | [diff] [blame] | 270 | </p> |
| 271 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 272 | <h2 id="Design">Design</h2> |
| 273 | |
Rob Pike | d1a1923 | 2016-08-27 12:09:38 +1000 | [diff] [blame] | 274 | <h3 id="runtime"> |
| 275 | Does Go have a runtime?</h3> |
| 276 | |
| 277 | <p> |
| 278 | Go does have an extensive library, called the <em>runtime</em>, |
| 279 | that is part of every Go program. |
| 280 | The runtime library implements garbage collection, concurrency, |
| 281 | stack management, and other critical features of the Go language. |
| 282 | Although it is more central to the language, Go's runtime is analogous |
| 283 | to <code>libc</code>, the C library. |
| 284 | </p> |
| 285 | |
| 286 | <p> |
| 287 | It is important to understand, however, that Go's runtime does not |
| 288 | include a virtual machine, such as is provided by the Java runtime. |
| 289 | Go programs are compiled ahead of time to native machine code. |
| 290 | Thus, although the term is often used to describe the virtual |
| 291 | environment in which a program runs, in Go the word “runtime” |
| 292 | is just the name given to the library providing critical language services. |
| 293 | </p> |
| 294 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 295 | <h3 id="unicode_identifiers"> |
| 296 | What's up with Unicode identifiers?</h3> |
| 297 | |
| 298 | <p> |
| 299 | It was important to us to extend the space of identifiers from the |
| 300 | confines of ASCII. Go's rule—identifier characters must be |
| 301 | letters or digits as defined by Unicode—is simple to understand |
| 302 | and to implement but has restrictions. Combining characters are |
| 303 | excluded by design, for instance. |
| 304 | Until there |
| 305 | is an agreed external definition of what an identifier might be, |
| 306 | plus a definition of canonicalization of identifiers that guarantees |
| 307 | no ambiguity, it seemed better to keep combining characters out of |
| 308 | the mix. Thus we have a simple rule that can be expanded later |
| 309 | without breaking programs, one that avoids bugs that would surely arise |
| 310 | from a rule that admits ambiguous identifiers. |
| 311 | </p> |
| 312 | |
| 313 | <p> |
| 314 | On a related note, since an exported identifier must begin with an |
| 315 | upper-case letter, identifiers created from “letters” |
| 316 | in some languages can, by definition, not be exported. For now the |
| 317 | only solution is to use something like <code>X日本語</code>, which |
| 318 | is clearly unsatisfactory; we are considering other options. The |
| 319 | case-for-visibility rule is unlikely to change however; it's one |
| 320 | of our favorite features of Go. |
| 321 | </p> |
| 322 | |
| 323 | <h3 id="Why_doesnt_Go_have_feature_X">Why does Go not have feature X?</h3> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 324 | |
| 325 | <p> |
| 326 | Every language contains novel features and omits someone's favorite |
| 327 | feature. Go was designed with an eye on felicity of programming, speed of |
| 328 | compilation, orthogonality of concepts, and the need to support features |
| 329 | such as concurrency and garbage collection. Your favorite feature may be |
| 330 | missing because it doesn't fit, because it affects compilation speed or |
| 331 | clarity of design, or because it would make the fundamental system model |
| 332 | too difficult. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 333 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 334 | |
| 335 | <p> |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 336 | If it bothers you that Go is missing feature <var>X</var>, |
| 337 | please forgive us and investigate the features that Go does have. You might find that |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 338 | they compensate in interesting ways for the lack of <var>X</var>. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 339 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 340 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 341 | <h3 id="generics"> |
| 342 | Why does Go not have generic types?</h3> |
| 343 | <p> |
| 344 | Generics may well be added at some point. We don't feel an urgency for |
| 345 | them, although we understand some programmers do. |
| 346 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 347 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 348 | <p> |
| 349 | Generics are convenient but they come at a cost in |
| 350 | complexity in the type system and run-time. We haven't yet found a |
| 351 | design that gives value proportionate to the complexity, although we |
| 352 | continue to think about it. Meanwhile, Go's built-in maps and slices, |
| 353 | plus the ability to use the empty interface to construct containers |
| 354 | (with explicit unboxing) mean in many cases it is possible to write |
| 355 | code that does what generics would enable, if less smoothly. |
| 356 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 357 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 358 | <p> |
Rob Pike | bc33dd7 | 2016-04-20 08:56:33 -0700 | [diff] [blame] | 359 | The topic remains open. |
| 360 | For a look at several previous unsuccessful attempts to |
| 361 | design a good generics solution for Go, see |
| 362 | <a href="https://golang.org/issue/15292">this proposal</a>. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 363 | </p> |
| 364 | |
| 365 | <h3 id="exceptions"> |
| 366 | Why does Go not have exceptions?</h3> |
| 367 | <p> |
| 368 | We believe that coupling exceptions to a control |
| 369 | structure, as in the <code>try-catch-finally</code> idiom, results in |
| 370 | convoluted code. It also tends to encourage programmers to label |
| 371 | too many ordinary errors, such as failing to open a file, as |
| 372 | exceptional. |
| 373 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 374 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 375 | <p> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 376 | Go takes a different approach. For plain error handling, Go's multi-value |
| 377 | returns make it easy to report an error without overloading the return value. |
Shenghou Ma | 97b13ac | 2012-03-07 08:15:47 +1100 | [diff] [blame] | 378 | <a href="/doc/articles/error_handling.html">A canonical error type, coupled |
| 379 | with Go's other features</a>, makes error handling pleasant but quite different |
| 380 | from that in other languages. |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 381 | </p> |
| 382 | |
| 383 | <p> |
| 384 | Go also has a couple |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 385 | of built-in functions to signal and recover from truly exceptional |
| 386 | conditions. The recovery mechanism is executed only as part of a |
| 387 | function's state being torn down after an error, which is sufficient |
| 388 | to handle catastrophe but requires no extra control structures and, |
| 389 | when used well, can result in clean error-handling code. |
| 390 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 391 | |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 392 | <p> |
Shenghou Ma | 97b13ac | 2012-03-07 08:15:47 +1100 | [diff] [blame] | 393 | See the <a href="/doc/articles/defer_panic_recover.html">Defer, Panic, and Recover</a> article for details. |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 394 | </p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 395 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 396 | <h3 id="assertions"> |
| 397 | Why does Go not have assertions?</h3> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 398 | |
| 399 | <p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 400 | Go doesn't provide assertions. They are undeniably convenient, but our |
| 401 | experience has been that programmers use them as a crutch to avoid thinking |
| 402 | about proper error handling and reporting. Proper error handling means that |
| 403 | servers continue operation after non-fatal errors instead of crashing. |
| 404 | Proper error reporting means that errors are direct and to the point, |
| 405 | saving the programmer from interpreting a large crash trace. Precise |
| 406 | errors are particularly important when the programmer seeing the errors is |
| 407 | not familiar with the code. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 408 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 409 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 410 | <p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 411 | We understand that this is a point of contention. There are many things in |
| 412 | the Go language and libraries that differ from modern practices, simply |
| 413 | because we feel it's sometimes worth trying a different approach. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 414 | </p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 415 | |
| 416 | <h3 id="csp"> |
| 417 | Why build concurrency on the ideas of CSP?</h3> |
| 418 | <p> |
| 419 | Concurrency and multi-threaded programming have a reputation |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 420 | for difficulty. We believe this is due partly to complex |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 421 | designs such as pthreads and partly to overemphasis on low-level details |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 422 | such as mutexes, condition variables, and memory barriers. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 423 | Higher-level interfaces enable much simpler code, even if there are still |
| 424 | mutexes and such under the covers. |
| 425 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 426 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 427 | <p> |
| 428 | One of the most successful models for providing high-level linguistic support |
| 429 | for concurrency comes from Hoare's Communicating Sequential Processes, or CSP. |
| 430 | Occam and Erlang are two well known languages that stem from CSP. |
| 431 | Go's concurrency primitives derive from a different part of the family tree |
| 432 | whose main contribution is the powerful notion of channels as first class objects. |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 433 | Experience with several earlier languages has shown that the CSP model |
| 434 | fits well into a procedural language framework. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 435 | </p> |
| 436 | |
| 437 | <h3 id="goroutines"> |
| 438 | Why goroutines instead of threads?</h3> |
| 439 | <p> |
| 440 | Goroutines are part of making concurrency easy to use. The idea, which has |
| 441 | been around for a while, is to multiplex independently executing |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 442 | functions—coroutines—onto a set of threads. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 443 | When a coroutine blocks, such as by calling a blocking system call, |
| 444 | the run-time automatically moves other coroutines on the same operating |
| 445 | system thread to a different, runnable thread so they won't be blocked. |
| 446 | The programmer sees none of this, which is the point. |
Rob Pike | 287967f | 2014-03-21 13:59:30 +1100 | [diff] [blame] | 447 | The result, which we call goroutines, can be very cheap: they have little |
| 448 | overhead beyond the memory for the stack, which is just a few kilobytes. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 449 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 450 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 451 | <p> |
Rob Pike | 287967f | 2014-03-21 13:59:30 +1100 | [diff] [blame] | 452 | To make the stacks small, Go's run-time uses resizable, bounded stacks. A newly |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 453 | minted goroutine is given a few kilobytes, which is almost always enough. |
Rob Pike | 287967f | 2014-03-21 13:59:30 +1100 | [diff] [blame] | 454 | When it isn't, the run-time grows (and shrinks) the memory for storing |
| 455 | the stack automatically, allowing many goroutines to live in a modest |
| 456 | amount of memory. |
| 457 | The CPU overhead averages about three cheap instructions per function call. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 458 | It is practical to create hundreds of thousands of goroutines in the same |
Rob Pike | 287967f | 2014-03-21 13:59:30 +1100 | [diff] [blame] | 459 | address space. |
| 460 | If goroutines were just threads, system resources would |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 461 | run out at a much smaller number. |
| 462 | </p> |
| 463 | |
| 464 | <h3 id="atomic_maps"> |
| 465 | Why are map operations not defined to be atomic?</h3> |
| 466 | |
| 467 | <p> |
| 468 | After long discussion it was decided that the typical use of maps did not require |
Ian Lance Taylor | 8189605 | 2013-12-12 18:48:40 -0800 | [diff] [blame] | 469 | safe access from multiple goroutines, and in those cases where it did, the map was |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 470 | probably part of some larger data structure or computation that was already |
| 471 | synchronized. Therefore requiring that all map operations grab a mutex would slow |
| 472 | down most programs and add safety to few. This was not an easy decision, |
| 473 | however, since it means uncontrolled map access can crash the program. |
| 474 | </p> |
| 475 | |
| 476 | <p> |
| 477 | The language does not preclude atomic map updates. When required, such |
| 478 | as when hosting an untrusted program, the implementation could interlock |
| 479 | map access. |
| 480 | </p> |
| 481 | |
Andrew Gerrand | 61dbc34 | 2013-05-06 15:02:56 -0700 | [diff] [blame] | 482 | <h3 id="language_changes"> |
| 483 | Will you accept my language change?</h3> |
| 484 | |
| 485 | <p> |
| 486 | People often suggest improvements to the language—the |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 487 | <a href="//groups.google.com/group/golang-nuts">mailing list</a> |
Andrew Gerrand | 61dbc34 | 2013-05-06 15:02:56 -0700 | [diff] [blame] | 488 | contains a rich history of such discussions—but very few of these changes have |
| 489 | been accepted. |
| 490 | </p> |
| 491 | |
| 492 | <p> |
| 493 | Although Go is an open source project, the language and libraries are protected |
| 494 | by a <a href="/doc/go1compat.html">compatibility promise</a> that prevents |
| 495 | changes that break existing programs. |
| 496 | If your proposal violates the Go 1 specification we cannot even entertain the |
| 497 | idea, regardless of its merit. |
| 498 | A future major release of Go may be incompatible with Go 1, but we're not ready |
| 499 | to start talking about what that might be. |
| 500 | </p> |
| 501 | |
| 502 | <p> |
Rob Pike | 61f3fdc | 2013-08-25 23:50:44 +1000 | [diff] [blame] | 503 | Even if your proposal is compatible with the Go 1 spec, it might |
Andrew Gerrand | 61dbc34 | 2013-05-06 15:02:56 -0700 | [diff] [blame] | 504 | not be in the spirit of Go's design goals. |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 505 | The article <i><a href="//talks.golang.org/2012/splash.article">Go |
Andrew Gerrand | 61dbc34 | 2013-05-06 15:02:56 -0700 | [diff] [blame] | 506 | at Google: Language Design in the Service of Software Engineering</a></i> |
| 507 | explains Go's origins and the motivation behind its design. |
| 508 | </p> |
| 509 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 510 | <h2 id="types">Types</h2> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 511 | |
| 512 | <h3 id="Is_Go_an_object-oriented_language"> |
| 513 | Is Go an object-oriented language?</h3> |
| 514 | |
| 515 | <p> |
| 516 | Yes and no. Although Go has types and methods and allows an |
| 517 | object-oriented style of programming, there is no type hierarchy. |
Russ Cox | e434f1a | 2009-11-07 17:31:22 -0800 | [diff] [blame] | 518 | The concept of “interface” in Go provides a different approach that |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 519 | we believe is easy to use and in some ways more general. There are |
| 520 | also ways to embed types in other types to provide something |
| 521 | analogous—but not identical—to subclassing. |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 522 | Moreover, methods in Go are more general than in C++ or Java: |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 523 | they can be defined for any sort of data, even built-in types such |
| 524 | as plain, “unboxed” integers. |
| 525 | They are not restricted to structs (classes). |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 526 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 527 | |
| 528 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 529 | Also, the lack of a type hierarchy makes “objects” in Go feel much more |
Russ Cox | e434f1a | 2009-11-07 17:31:22 -0800 | [diff] [blame] | 530 | lightweight than in languages such as C++ or Java. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 531 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 532 | |
| 533 | <h3 id="How_do_I_get_dynamic_dispatch_of_methods"> |
| 534 | How do I get dynamic dispatch of methods?</h3> |
| 535 | |
| 536 | <p> |
| 537 | The only way to have dynamically dispatched methods is through an |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 538 | interface. Methods on a struct or any other concrete type are always resolved statically. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 539 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 540 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 541 | <h3 id="inheritance"> |
| 542 | Why is there no type inheritance?</h3> |
| 543 | <p> |
| 544 | Object-oriented programming, at least in the best-known languages, |
| 545 | involves too much discussion of the relationships between types, |
| 546 | relationships that often could be derived automatically. Go takes a |
| 547 | different approach. |
| 548 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 549 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 550 | <p> |
| 551 | Rather than requiring the programmer to declare ahead of time that two |
| 552 | types are related, in Go a type automatically satisfies any interface |
| 553 | that specifies a subset of its methods. Besides reducing the |
| 554 | bookkeeping, this approach has real advantages. Types can satisfy |
| 555 | many interfaces at once, without the complexities of traditional |
| 556 | multiple inheritance. |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 557 | Interfaces can be very lightweight—an interface with |
| 558 | one or even zero methods can express a useful concept. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 559 | Interfaces can be added after the fact if a new idea comes along |
| 560 | or for testing—without annotating the original types. |
| 561 | Because there are no explicit relationships between types |
| 562 | and interfaces, there is no type hierarchy to manage or discuss. |
| 563 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 564 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 565 | <p> |
| 566 | It's possible to use these ideas to construct something analogous to |
| 567 | type-safe Unix pipes. For instance, see how <code>fmt.Fprintf</code> |
| 568 | enables formatted printing to any output, not just a file, or how the |
| 569 | <code>bufio</code> package can be completely separate from file I/O, |
Rob Pike | 8649444 | 2011-11-08 16:26:03 -0800 | [diff] [blame] | 570 | or how the <code>image</code> packages generate compressed |
| 571 | image files. All these ideas stem from a single interface |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 572 | (<code>io.Writer</code>) representing a single method |
| 573 | (<code>Write</code>). And that's only scratching the surface. |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 574 | Go's interfaces have a profound influence on how programs are structured. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 575 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 576 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 577 | <p> |
| 578 | It takes some getting used to but this implicit style of type |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 579 | dependency is one of the most productive things about Go. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 580 | </p> |
| 581 | |
| 582 | <h3 id="methods_on_basics"> |
| 583 | Why is <code>len</code> a function and not a method?</h3> |
| 584 | <p> |
| 585 | We debated this issue but decided |
| 586 | implementing <code>len</code> and friends as functions was fine in practice and |
| 587 | didn't complicate questions about the interface (in the Go type sense) |
| 588 | of basic types. |
| 589 | </p> |
| 590 | |
| 591 | <h3 id="overloading"> |
| 592 | Why does Go not support overloading of methods and operators?</h3> |
| 593 | <p> |
| 594 | Method dispatch is simplified if it doesn't need to do type matching as well. |
| 595 | Experience with other languages told us that having a variety of |
| 596 | methods with the same name but different signatures was occasionally useful |
| 597 | but that it could also be confusing and fragile in practice. Matching only by name |
| 598 | and requiring consistency in the types was a major simplifying decision |
| 599 | in Go's type system. |
| 600 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 601 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 602 | <p> |
| 603 | Regarding operator overloading, it seems more a convenience than an absolute |
| 604 | requirement. Again, things are simpler without it. |
| 605 | </p> |
| 606 | |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 607 | <h3 id="implements_interface"> |
| 608 | Why doesn't Go have "implements" declarations?</h3> |
| 609 | |
| 610 | <p> |
| 611 | A Go type satisfies an interface by implementing the methods of that interface, |
| 612 | nothing more. This property allows interfaces to be defined and used without |
Rob Pike | 4be9b83 | 2012-09-07 14:01:02 -0700 | [diff] [blame] | 613 | having to modify existing code. It enables a kind of structural typing that |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 614 | promotes separation of concerns and improves code re-use, and makes it easier |
| 615 | to build on patterns that emerge as the code develops. |
| 616 | The semantics of interfaces is one of the main reasons for Go's nimble, |
| 617 | lightweight feel. |
| 618 | </p> |
| 619 | |
| 620 | <p> |
| 621 | See the <a href="#inheritance">question on type inheritance</a> for more detail. |
| 622 | </p> |
| 623 | |
| 624 | <h3 id="guarantee_satisfies_interface"> |
| 625 | How can I guarantee my type satisfies an interface?</h3> |
| 626 | |
| 627 | <p> |
| 628 | You can ask the compiler to check that the type <code>T</code> implements the |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 629 | interface <code>I</code> by attempting an assignment using the zero value for |
| 630 | <code>T</code> or pointer to <code>T</code>, as appropriate: |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 631 | </p> |
| 632 | |
| 633 | <pre> |
| 634 | type T struct{} |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 635 | var _ I = T{} // Verify that T implements I. |
| 636 | var _ I = (*T)(nil) // Verify that *T implements I. |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 637 | </pre> |
| 638 | |
| 639 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 640 | If <code>T</code> (or <code>*T</code>, accordingly) doesn't implement |
| 641 | <code>I</code>, the mistake will be caught at compile time. |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 642 | </p> |
| 643 | |
| 644 | <p> |
| 645 | If you wish the users of an interface to explicitly declare that they implement |
| 646 | it, you can add a method with a descriptive name to the interface's method set. |
| 647 | For example: |
| 648 | </p> |
| 649 | |
| 650 | <pre> |
| 651 | type Fooer interface { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 652 | Foo() |
| 653 | ImplementsFooer() |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 654 | } |
| 655 | </pre> |
| 656 | |
| 657 | <p> |
| 658 | A type must then implement the <code>ImplementsFooer</code> method to be a |
Andrew Gerrand | 393ea2d | 2011-03-17 16:37:34 +1100 | [diff] [blame] | 659 | <code>Fooer</code>, clearly documenting the fact and announcing it in |
| 660 | <a href="/cmd/godoc/">godoc</a>'s output. |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 661 | </p> |
| 662 | |
| 663 | <pre> |
| 664 | type Bar struct{} |
| 665 | func (b Bar) ImplementsFooer() {} |
| 666 | func (b Bar) Foo() {} |
| 667 | </pre> |
| 668 | |
| 669 | <p> |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 670 | Most code doesn't make use of such constraints, since they limit the utility of |
Andrew Gerrand | aef4e1c | 2011-03-04 13:11:07 +1100 | [diff] [blame] | 671 | the interface idea. Sometimes, though, they're necessary to resolve ambiguities |
| 672 | among similar interfaces. |
| 673 | </p> |
| 674 | |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 675 | <h3 id="t_and_equal_interface"> |
| 676 | Why doesn't type T satisfy the Equal interface?</h3> |
| 677 | |
| 678 | <p> |
| 679 | Consider this simple interface to represent an object that can compare |
| 680 | itself with another value: |
| 681 | </p> |
| 682 | |
| 683 | <pre> |
| 684 | type Equaler interface { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 685 | Equal(Equaler) bool |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 686 | } |
| 687 | </pre> |
| 688 | |
| 689 | <p> |
| 690 | and this type, <code>T</code>: |
| 691 | </p> |
| 692 | |
| 693 | <pre> |
| 694 | type T int |
| 695 | func (t T) Equal(u T) bool { return t == u } // does not satisfy Equaler |
| 696 | </pre> |
| 697 | |
| 698 | <p> |
| 699 | Unlike the analogous situation in some polymorphic type systems, |
| 700 | <code>T</code> does not implement <code>Equaler</code>. |
| 701 | The argument type of <code>T.Equal</code> is <code>T</code>, |
| 702 | not literally the required type <code>Equaler</code>. |
| 703 | </p> |
| 704 | |
| 705 | <p> |
| 706 | In Go, the type system does not promote the argument of |
| 707 | <code>Equal</code>; that is the programmer's responsibility, as |
| 708 | illustrated by the type <code>T2</code>, which does implement |
| 709 | <code>Equaler</code>: |
| 710 | </p> |
| 711 | |
| 712 | <pre> |
| 713 | type T2 int |
| 714 | func (t T2) Equal(u Equaler) bool { return t == u.(T2) } // satisfies Equaler |
| 715 | </pre> |
| 716 | |
| 717 | <p> |
| 718 | Even this isn't like other type systems, though, because in Go <em>any</em> |
| 719 | type that satisfies <code>Equaler</code> could be passed as the |
| 720 | argument to <code>T2.Equal</code>, and at run time we must |
| 721 | check that the argument is of type <code>T2</code>. |
| 722 | Some languages arrange to make that guarantee at compile time. |
| 723 | </p> |
| 724 | |
| 725 | <p> |
| 726 | A related example goes the other way: |
| 727 | </p> |
| 728 | |
| 729 | <pre> |
| 730 | type Opener interface { |
David Symonds | c912150 | 2013-05-22 12:28:58 +1000 | [diff] [blame] | 731 | Open() Reader |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 732 | } |
| 733 | |
| 734 | func (t T3) Open() *os.File |
| 735 | </pre> |
| 736 | |
| 737 | <p> |
| 738 | In Go, <code>T3</code> does not satisfy <code>Opener</code>, |
| 739 | although it might in another language. |
| 740 | </p> |
| 741 | |
| 742 | <p> |
| 743 | While it is true that Go's type system does less for the programmer |
| 744 | in such cases, the lack of subtyping makes the rules about |
| 745 | interface satisfaction very easy to state: are the function's names |
| 746 | and signatures exactly those of the interface? |
| 747 | Go's rule is also easy to implement efficiently. |
| 748 | We feel these benefits offset the lack of |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 749 | automatic type promotion. Should Go one day adopt some form of polymorphic |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 750 | typing, we expect there would be a way to express the idea of these |
| 751 | examples and also have them be statically checked. |
| 752 | </p> |
| 753 | |
Andrew Gerrand | 17805dd | 2011-06-18 20:31:38 +1000 | [diff] [blame] | 754 | <h3 id="convert_slice_of_interface"> |
| 755 | Can I convert a []T to an []interface{}?</h3> |
| 756 | |
| 757 | <p> |
Rob Pike | 8649444 | 2011-11-08 16:26:03 -0800 | [diff] [blame] | 758 | Not directly, because they do not have the same representation in memory. |
Andrew Gerrand | 17805dd | 2011-06-18 20:31:38 +1000 | [diff] [blame] | 759 | It is necessary to copy the elements individually to the destination |
| 760 | slice. This example converts a slice of <code>int</code> to a slice of |
| 761 | <code>interface{}</code>: |
| 762 | </p> |
| 763 | |
| 764 | <pre> |
| 765 | t := []int{1, 2, 3, 4} |
| 766 | s := make([]interface{}, len(t)) |
| 767 | for i, v := range t { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 768 | s[i] = v |
Andrew Gerrand | 17805dd | 2011-06-18 20:31:38 +1000 | [diff] [blame] | 769 | } |
| 770 | </pre> |
| 771 | |
Rob Pike | 1e0f97a | 2012-02-17 16:27:17 +1100 | [diff] [blame] | 772 | <h3 id="nil_error"> |
| 773 | Why is my nil error value not equal to nil? |
| 774 | </h3> |
| 775 | |
| 776 | <p> |
| 777 | Under the covers, interfaces are implemented as two elements, a type and a value. |
| 778 | The value, called the interface's dynamic value, |
| 779 | is an arbitrary concrete value and the type is that of the value. |
| 780 | For the <code>int</code> value 3, an interface value contains, |
| 781 | schematically, (<code>int</code>, <code>3</code>). |
| 782 | </p> |
| 783 | |
| 784 | <p> |
| 785 | An interface value is <code>nil</code> only if the inner value and type are both unset, |
| 786 | (<code>nil</code>, <code>nil</code>). |
| 787 | In particular, a <code>nil</code> interface will always hold a <code>nil</code> type. |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 788 | If we store a <code>nil</code> pointer of type <code>*int</code> inside |
Rob Pike | 1e0f97a | 2012-02-17 16:27:17 +1100 | [diff] [blame] | 789 | an interface value, the inner type will be <code>*int</code> regardless of the value of the pointer: |
| 790 | (<code>*int</code>, <code>nil</code>). |
| 791 | Such an interface value will therefore be non-<code>nil</code> |
| 792 | <em>even when the pointer inside is</em> <code>nil</code>. |
| 793 | </p> |
| 794 | |
| 795 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 796 | This situation can be confusing, and arises when a <code>nil</code> value is |
Rob Pike | 1e0f97a | 2012-02-17 16:27:17 +1100 | [diff] [blame] | 797 | stored inside an interface value such as an <code>error</code> return: |
| 798 | </p> |
| 799 | |
| 800 | <pre> |
| 801 | func returnsError() error { |
| 802 | var p *MyError = nil |
| 803 | if bad() { |
| 804 | p = ErrBad |
| 805 | } |
| 806 | return p // Will always return a non-nil error. |
| 807 | } |
| 808 | </pre> |
| 809 | |
| 810 | <p> |
| 811 | If all goes well, the function returns a <code>nil</code> <code>p</code>, |
| 812 | so the return value is an <code>error</code> interface |
| 813 | value holding (<code>*MyError</code>, <code>nil</code>). |
| 814 | This means that if the caller compares the returned error to <code>nil</code>, |
| 815 | it will always look as if there was an error even if nothing bad happened. |
| 816 | To return a proper <code>nil</code> <code>error</code> to the caller, |
| 817 | the function must return an explicit <code>nil</code>: |
| 818 | </p> |
| 819 | |
| 820 | |
| 821 | <pre> |
| 822 | func returnsError() error { |
| 823 | if bad() { |
| 824 | return ErrBad |
| 825 | } |
| 826 | return nil |
| 827 | } |
| 828 | </pre> |
| 829 | |
| 830 | <p> |
| 831 | It's a good idea for functions |
| 832 | that return errors always to use the <code>error</code> type in |
| 833 | their signature (as we did above) rather than a concrete type such |
| 834 | as <code>*MyError</code>, to help guarantee the error is |
| 835 | created correctly. As an example, |
| 836 | <a href="/pkg/os/#Open"><code>os.Open</code></a> |
| 837 | returns an <code>error</code> even though, if not <code>nil</code>, |
| 838 | it's always of concrete type |
| 839 | <a href="/pkg/os/#PathError"><code>*os.PathError</code></a>. |
| 840 | </p> |
| 841 | |
| 842 | <p> |
| 843 | Similar situations to those described here can arise whenever interfaces are used. |
| 844 | Just keep in mind that if any concrete value |
| 845 | has been stored in the interface, the interface will not be <code>nil</code>. |
| 846 | For more information, see |
Shenghou Ma | cb6c09a | 2012-03-01 14:54:35 +0800 | [diff] [blame] | 847 | <a href="/doc/articles/laws_of_reflection.html">The Laws of Reflection</a>. |
Rob Pike | 1e0f97a | 2012-02-17 16:27:17 +1100 | [diff] [blame] | 848 | </p> |
| 849 | |
| 850 | |
Rob Pike | 7d87f3d | 2011-08-06 11:21:59 +1000 | [diff] [blame] | 851 | <h3 id="unions"> |
| 852 | Why are there no untagged unions, as in C?</h3> |
| 853 | |
| 854 | <p> |
| 855 | Untagged unions would violate Go's memory safety |
| 856 | guarantees. |
| 857 | </p> |
| 858 | |
| 859 | <h3 id="variant_types"> |
| 860 | Why does Go not have variant types?</h3> |
| 861 | |
| 862 | <p> |
| 863 | Variant types, also known as algebraic types, provide a way to specify |
| 864 | that a value might take one of a set of other types, but only those |
| 865 | types. A common example in systems programming would specify that an |
| 866 | error is, say, a network error, a security error or an application |
| 867 | error and allow the caller to discriminate the source of the problem |
| 868 | by examining the type of the error. Another example is a syntax tree |
| 869 | in which each node can be a different type: declaration, statement, |
| 870 | assignment and so on. |
| 871 | </p> |
| 872 | |
| 873 | <p> |
| 874 | We considered adding variant types to Go, but after discussion |
| 875 | decided to leave them out because they overlap in confusing ways |
| 876 | with interfaces. What would happen if the elements of a variant type |
| 877 | were themselves interfaces? |
| 878 | </p> |
| 879 | |
| 880 | <p> |
| 881 | Also, some of what variant types address is already covered by the |
| 882 | language. The error example is easy to express using an interface |
| 883 | value to hold the error and a type switch to discriminate cases. The |
| 884 | syntax tree example is also doable, although not as elegantly. |
| 885 | </p> |
| 886 | |
Ian Lance Taylor | 85dcc34 | 2015-11-20 07:00:09 -0800 | [diff] [blame] | 887 | <h3 id="covariant_types"> |
| 888 | Why does Go not have covariant result types?</h3> |
| 889 | |
| 890 | <p> |
| 891 | Covariant result types would mean that an interface like |
Brad Fitzpatrick | e719147 | 2016-09-20 21:52:11 +0000 | [diff] [blame] | 892 | </p> |
Ian Lance Taylor | 85dcc34 | 2015-11-20 07:00:09 -0800 | [diff] [blame] | 893 | |
| 894 | <pre> |
| 895 | type Copyable interface { |
| 896 | Copy() interface{} |
| 897 | } |
| 898 | </pre> |
| 899 | |
Brad Fitzpatrick | e719147 | 2016-09-20 21:52:11 +0000 | [diff] [blame] | 900 | <p> |
Ian Lance Taylor | 85dcc34 | 2015-11-20 07:00:09 -0800 | [diff] [blame] | 901 | would be satisfied by the method |
Brad Fitzpatrick | e719147 | 2016-09-20 21:52:11 +0000 | [diff] [blame] | 902 | </p> |
Ian Lance Taylor | 85dcc34 | 2015-11-20 07:00:09 -0800 | [diff] [blame] | 903 | |
| 904 | <pre> |
| 905 | func (v Value) Copy() Value |
| 906 | </pre> |
| 907 | |
Rob Pike | d1a1923 | 2016-08-27 12:09:38 +1000 | [diff] [blame] | 908 | <p>because <code>Value</code> implements the empty interface. |
Ian Lance Taylor | 85dcc34 | 2015-11-20 07:00:09 -0800 | [diff] [blame] | 909 | In Go method types must match exactly, so <code>Value</code> does not |
| 910 | implement <code>Copyable</code>. |
| 911 | Go separates the notion of what a |
| 912 | type does—its methods—from the type's implementation. |
| 913 | If two methods return different types, they are not doing the same thing. |
| 914 | Programmers who want covariant result types are often trying to |
Russ Cox | cf49b35 | 2015-12-11 11:35:36 -0500 | [diff] [blame] | 915 | express a type hierarchy through interfaces. |
Ian Lance Taylor | 85dcc34 | 2015-11-20 07:00:09 -0800 | [diff] [blame] | 916 | In Go it's more natural to have a clean separation between interface |
| 917 | and implementation. |
| 918 | </p> |
| 919 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 920 | <h2 id="values">Values</h2> |
| 921 | |
| 922 | <h3 id="conversions"> |
| 923 | Why does Go not provide implicit numeric conversions?</h3> |
| 924 | <p> |
| 925 | The convenience of automatic conversion between numeric types in C is |
| 926 | outweighed by the confusion it causes. When is an expression unsigned? |
| 927 | How big is the value? Does it overflow? Is the result portable, independent |
| 928 | of the machine on which it executes? |
| 929 | It also complicates the compiler; “the usual arithmetic conversions” |
| 930 | are not easy to implement and inconsistent across architectures. |
| 931 | For reasons of portability, we decided to make things clear and straightforward |
| 932 | at the cost of some explicit conversions in the code. |
| 933 | The definition of constants in Go—arbitrary precision values free |
| 934 | of signedness and size annotations—ameliorates matters considerably, |
| 935 | though. |
| 936 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 937 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 938 | <p> |
| 939 | A related detail is that, unlike in C, <code>int</code> and <code>int64</code> |
| 940 | are distinct types even if <code>int</code> is a 64-bit type. The <code>int</code> |
| 941 | type is generic; if you care about how many bits an integer holds, Go |
| 942 | encourages you to be explicit. |
| 943 | </p> |
| 944 | |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 945 | <p> |
Brad Fitzpatrick | 783297a | 2015-07-11 08:51:20 -0600 | [diff] [blame] | 946 | A blog post titled <a href="https://blog.golang.org/constants">Constants</a> |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 947 | explores this topic in more detail. |
| 948 | </p> |
| 949 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 950 | <h3 id="builtin_maps"> |
| 951 | Why are maps built in?</h3> |
| 952 | <p> |
| 953 | The same reason strings are: they are such a powerful and important data |
| 954 | structure that providing one excellent implementation with syntactic support |
| 955 | makes programming more pleasant. We believe that Go's implementation of maps |
| 956 | is strong enough that it will serve for the vast majority of uses. |
| 957 | If a specific application can benefit from a custom implementation, it's possible |
| 958 | to write one but it will not be as convenient syntactically; this seems a reasonable tradeoff. |
| 959 | </p> |
| 960 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 961 | <h3 id="map_keys"> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 962 | Why don't maps allow slices as keys?</h3> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 963 | <p> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 964 | Map lookup requires an equality operator, which slices do not implement. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 965 | They don't implement equality because equality is not well defined on such types; |
| 966 | there are multiple considerations involving shallow vs. deep comparison, pointer vs. |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 967 | value comparison, how to deal with recursive types, and so on. |
| 968 | We may revisit this issue—and implementing equality for slices |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 969 | will not invalidate any existing programs—but without a clear idea of what |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 970 | equality of slices should mean, it was simpler to leave it out for now. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 971 | </p> |
| 972 | |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 973 | <p> |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 974 | In Go 1, unlike prior releases, equality is defined for structs and arrays, so such |
| 975 | types can be used as map keys. Slices still do not have a definition of equality, though. |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 976 | </p> |
| 977 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 978 | <h3 id="references"> |
| 979 | Why are maps, slices, and channels references while arrays are values?</h3> |
| 980 | <p> |
| 981 | There's a lot of history on that topic. Early on, maps and channels |
| 982 | were syntactically pointers and it was impossible to declare or use a |
| 983 | non-pointer instance. Also, we struggled with how arrays should work. |
| 984 | Eventually we decided that the strict separation of pointers and |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 985 | values made the language harder to use. Changing these |
| 986 | types to act as references to the associated, shared data structures resolved |
| 987 | these issues. This change added some regrettable complexity to the |
| 988 | language but had a large effect on usability: Go became a more |
| 989 | productive, comfortable language when it was introduced. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 990 | </p> |
| 991 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 992 | <h2 id="Writing_Code">Writing Code</h2> |
| 993 | |
| 994 | <h3 id="How_are_libraries_documented"> |
| 995 | How are libraries documented?</h3> |
| 996 | |
| 997 | <p> |
| 998 | There is a program, <code>godoc</code>, written in Go, that extracts |
| 999 | package documentation from the source code. It can be used on the |
| 1000 | command line or on the web. An instance is running at |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1001 | <a href="/pkg/">golang.org/pkg/</a>. |
Russ Cox | e434f1a | 2009-11-07 17:31:22 -0800 | [diff] [blame] | 1002 | In fact, <code>godoc</code> implements the full site at |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1003 | <a href="/">golang.org/</a>. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1004 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1005 | |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1006 | <p> |
| 1007 | A <code>godoc</code> instance may be configured to provide rich, |
| 1008 | interactive static analyses of symbols in the programs it displays; details are |
| 1009 | listed <a href="https://golang.org/lib/godoc/analysis/help.html">here</a>. |
| 1010 | </p> |
| 1011 | |
| 1012 | <p> |
| 1013 | For access to documentation from the command line, the |
| 1014 | <a href="https://golang.org/pkg/cmd/go/">go</a> tool has a |
| 1015 | <a href="https://golang.org/pkg/cmd/go/#hdr-Show_documentation_for_package_or_symbol">doc</a> |
| 1016 | subcommand that provides a textual interface to the same information. |
| 1017 | </p> |
| 1018 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1019 | <h3 id="Is_there_a_Go_programming_style_guide"> |
| 1020 | Is there a Go programming style guide?</h3> |
| 1021 | |
| 1022 | <p> |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 1023 | Eventually, there may be a small number of rules to guide things |
| 1024 | like naming, layout, and file organization. |
| 1025 | The document <a href="effective_go.html">Effective Go</a> |
| 1026 | contains some style advice. |
| 1027 | More directly, the program <code>gofmt</code> is a pretty-printer |
| 1028 | whose purpose is to enforce layout rules; it replaces the usual |
| 1029 | compendium of do's and don'ts that allows interpretation. |
| 1030 | All the Go code in the repository has been run through <code>gofmt</code>. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1031 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1032 | |
Rob Pike | 3a7fe36 | 2014-03-06 13:15:09 +1100 | [diff] [blame] | 1033 | <p> |
| 1034 | The document titled |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1035 | <a href="//golang.org/s/comments">Go Code Review Comments</a> |
Rob Pike | 3a7fe36 | 2014-03-06 13:15:09 +1100 | [diff] [blame] | 1036 | is a collection of very short essays about details of Go idiom that are often |
| 1037 | missed by programmers. |
| 1038 | It is a handy reference for people doing code reviews for Go projects. |
| 1039 | </p> |
| 1040 | |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1041 | <h3 id="How_do_I_submit_patches_to_the_Go_libraries"> |
| 1042 | How do I submit patches to the Go libraries?</h3> |
| 1043 | |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 1044 | <p> |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1045 | The library sources are in the <code>src</code> directory of the repository. |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 1046 | If you want to make a significant change, please discuss on the mailing list before embarking. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1047 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1048 | |
Rob Pike | 0c2a479 | 2009-11-01 20:50:42 -0800 | [diff] [blame] | 1049 | <p> |
| 1050 | See the document |
| 1051 | <a href="contribute.html">Contributing to the Go project</a> |
| 1052 | for more information about how to proceed. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1053 | </p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1054 | |
Herbert Georg Fischer | 99021b7 | 2013-03-15 13:43:10 -0700 | [diff] [blame] | 1055 | <h3 id="git_https"> |
| 1056 | Why does "go get" use HTTPS when cloning a repository?</h3> |
| 1057 | |
| 1058 | <p> |
| 1059 | Companies often permit outgoing traffic only on the standard TCP ports 80 (HTTP) |
| 1060 | and 443 (HTTPS), blocking outgoing traffic on other ports, including TCP port 9418 |
| 1061 | (git) and TCP port 22 (SSH). |
| 1062 | When using HTTPS instead of HTTP, <code>git</code> enforces certificate validation by |
| 1063 | default, providing protection against man-in-the-middle, eavesdropping and tampering attacks. |
| 1064 | The <code>go get</code> command therefore uses HTTPS for safety. |
| 1065 | </p> |
| 1066 | |
| 1067 | <p> |
| 1068 | If you use <code>git</code> and prefer to push changes through SSH using your existing key |
| 1069 | it's easy to work around this. For GitHub, try one of these solutions: |
| 1070 | </p> |
| 1071 | <ul> |
| 1072 | <li>Manually clone the repository in the expected package directory: |
| 1073 | <pre> |
| 1074 | $ cd $GOPATH/src/github.com/username |
| 1075 | $ git clone git@github.com:username/package.git |
| 1076 | </pre> |
| 1077 | </li> |
| 1078 | <li>Force <code>git push</code> to use the <code>SSH</code> protocol by appending |
| 1079 | these two lines to <code>~/.gitconfig</code>: |
| 1080 | <pre> |
| 1081 | [url "git@github.com:"] |
| 1082 | pushInsteadOf = https://github.com/ |
| 1083 | </pre> |
| 1084 | </li> |
| 1085 | </ul> |
| 1086 | |
Russ Cox | dc8d903 | 2013-10-03 09:18:47 -0400 | [diff] [blame] | 1087 | <h3 id="get_version"> |
| 1088 | How should I manage package versions using "go get"?</h3> |
| 1089 | |
| 1090 | <p> |
| 1091 | "Go get" does not have any explicit concept of package versions. |
| 1092 | Versioning is a source of significant complexity, especially in large code bases, |
| 1093 | and we are unaware of any approach that works well at scale in a large enough |
| 1094 | variety of situations to be appropriate to force on all Go users. |
| 1095 | What "go get" and the larger Go toolchain do provide is isolation of |
| 1096 | packages with different import paths. |
| 1097 | For example, the standard library's <code>html/template</code> and <code>text/template</code> |
| 1098 | coexist even though both are "package template". |
| 1099 | This observation leads to some advice for package authors and package users. |
| 1100 | </p> |
| 1101 | |
| 1102 | <p> |
| 1103 | Packages intended for public use should try to maintain backwards compatibility as they evolve. |
| 1104 | The <a href="/doc/go1compat.html">Go 1 compatibility guidelines</a> are a good reference here: |
| 1105 | don't remove exported names, encourage tagged composite literals, and so on. |
| 1106 | If different functionality is required, add a new name instead of changing an old one. |
| 1107 | If a complete break is required, create a new package with a new import path.</p> |
| 1108 | |
| 1109 | <p> |
| 1110 | If you're using an externally supplied package and worry that it might change in |
| 1111 | unexpected ways, the simplest solution is to copy it to your local repository. |
| 1112 | (This is the approach Google takes internally.) |
| 1113 | Store the copy under a new import path that identifies it as a local copy. |
| 1114 | For example, you might copy "original.com/pkg" to "you.com/external/original.com/pkg". |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1115 | The <a href="https://godoc.org/golang.org/x/tools/cmd/gomvpkg">gomvpkg</a> |
| 1116 | program is one tool to help automate this process. |
| 1117 | </p> |
| 1118 | |
| 1119 | <p> |
| 1120 | The Go 1.5 release includes an experimental facility to the |
| 1121 | <a href="https://golang.org/cmd/go">go</a> command |
| 1122 | that makes it easier to manage external dependencies by "vendoring" |
| 1123 | them into a special directory near the package that depends upon them. |
| 1124 | See the <a href="https://golang.org/s/go15vendor">design |
| 1125 | document</a> for details. |
Russ Cox | dc8d903 | 2013-10-03 09:18:47 -0400 | [diff] [blame] | 1126 | </p> |
| 1127 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1128 | <h2 id="Pointers">Pointers and Allocation</h2> |
| 1129 | |
| 1130 | <h3 id="pass_by_value"> |
| 1131 | When are function parameters passed by value?</h3> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1132 | |
| 1133 | <p> |
Rob Pike | 8649444 | 2011-11-08 16:26:03 -0800 | [diff] [blame] | 1134 | As in all languages in the C family, everything in Go is passed by value. |
| 1135 | That is, a function always gets a copy of the |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1136 | thing being passed, as if there were an assignment statement assigning the |
Rob Pike | 8649444 | 2011-11-08 16:26:03 -0800 | [diff] [blame] | 1137 | value to the parameter. For instance, passing an <code>int</code> value |
| 1138 | to a function makes a copy of the <code>int</code>, and passing a pointer |
| 1139 | value makes a copy of the pointer, but not the data it points to. |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1140 | (See a <a href="/doc/faq#methods_on_values_or_pointers">later |
| 1141 | section</a> for a discussion of how this affects method receivers.) |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1142 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1143 | |
| 1144 | <p> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1145 | Map and slice values behave like pointers: they are descriptors that |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1146 | contain pointers to the underlying map or slice data. Copying a map or |
| 1147 | slice value doesn't copy the data it points to. Copying an interface value |
| 1148 | makes a copy of the thing stored in the interface value. If the interface |
| 1149 | value holds a struct, copying the interface value makes a copy of the |
| 1150 | struct. If the interface value holds a pointer, copying the interface value |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1151 | makes a copy of the pointer, but again not the data it points to. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1152 | </p> |
| 1153 | |
Rob Pike | 09cd13c | 2013-03-15 11:38:50 -0700 | [diff] [blame] | 1154 | <h3 id="pointer_to_interface"> |
| 1155 | When should I use a pointer to an interface?</h3> |
| 1156 | |
| 1157 | <p> |
| 1158 | Almost never. Pointers to interface values arise only in rare, tricky situations involving |
| 1159 | disguising an interface value's type for delayed evaluation. |
| 1160 | </p> |
| 1161 | |
| 1162 | <p> |
| 1163 | It is however a common mistake to pass a pointer to an interface value |
| 1164 | to a function expecting an interface. The compiler will complain about this |
| 1165 | error but the situation can still be confusing, because sometimes a |
| 1166 | <a href="#different_method_sets">pointer |
| 1167 | is necessary to satisfy an interface</a>. |
| 1168 | The insight is that although a pointer to a concrete type can satisfy |
Rob Pike | a942265 | 2014-10-26 11:27:55 -0700 | [diff] [blame] | 1169 | an interface, with one exception <em>a pointer to an interface can never satisfy an interface</em>. |
Rob Pike | 09cd13c | 2013-03-15 11:38:50 -0700 | [diff] [blame] | 1170 | </p> |
| 1171 | |
| 1172 | <p> |
| 1173 | Consider the variable declaration, |
| 1174 | </p> |
| 1175 | |
| 1176 | <pre> |
| 1177 | var w io.Writer |
| 1178 | </pre> |
| 1179 | |
| 1180 | <p> |
| 1181 | The printing function <code>fmt.Fprintf</code> takes as its first argument |
| 1182 | a value that satisfies <code>io.Writer</code>—something that implements |
| 1183 | the canonical <code>Write</code> method. Thus we can write |
| 1184 | </p> |
| 1185 | |
| 1186 | <pre> |
| 1187 | fmt.Fprintf(w, "hello, world\n") |
| 1188 | </pre> |
| 1189 | |
| 1190 | <p> |
| 1191 | If however we pass the address of <code>w</code>, the program will not compile. |
| 1192 | </p> |
| 1193 | |
| 1194 | <pre> |
| 1195 | fmt.Fprintf(&w, "hello, world\n") // Compile-time error. |
| 1196 | </pre> |
| 1197 | |
| 1198 | <p> |
| 1199 | The one exception is that any value, even a pointer to an interface, can be assigned to |
| 1200 | a variable of empty interface type (<code>interface{}</code>). |
| 1201 | Even so, it's almost certainly a mistake if the value is a pointer to an interface; |
| 1202 | the result can be confusing. |
| 1203 | </p> |
| 1204 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1205 | <h3 id="methods_on_values_or_pointers"> |
| 1206 | Should I define methods on values or pointers?</h3> |
| 1207 | |
| 1208 | <pre> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1209 | func (s *MyStruct) pointerMethod() { } // method on pointer |
| 1210 | func (s MyStruct) valueMethod() { } // method on value |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1211 | </pre> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1212 | |
| 1213 | <p> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1214 | For programmers unaccustomed to pointers, the distinction between these |
| 1215 | two examples can be confusing, but the situation is actually very simple. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1216 | When defining a method on a type, the receiver (<code>s</code> in the above |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1217 | examples) behaves exactly as if it were an argument to the method. |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1218 | Whether to define the receiver as a value or as a pointer is the same |
| 1219 | question, then, as whether a function argument should be a value or |
| 1220 | a pointer. |
| 1221 | There are several considerations. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1222 | </p> |
| 1223 | |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1224 | <p> |
| 1225 | First, and most important, does the method need to modify the |
| 1226 | receiver? |
| 1227 | If it does, the receiver <em>must</em> be a pointer. |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 1228 | (Slices and maps act as references, so their story is a little |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1229 | more subtle, but for instance to change the length of a slice |
| 1230 | in a method the receiver must still be a pointer.) |
| 1231 | In the examples above, if <code>pointerMethod</code> modifies |
| 1232 | the fields of <code>s</code>, |
| 1233 | the caller will see those changes, but <code>valueMethod</code> |
| 1234 | is called with a copy of the caller's argument (that's the definition |
| 1235 | of passing a value), so changes it makes will be invisible to the caller. |
| 1236 | </p> |
| 1237 | |
| 1238 | <p> |
| 1239 | By the way, pointer receivers are identical to the situation in Java, |
| 1240 | although in Java the pointers are hidden under the covers; it's Go's |
| 1241 | value receivers that are unusual. |
| 1242 | </p> |
| 1243 | |
| 1244 | <p> |
| 1245 | Second is the consideration of efficiency. If the receiver is large, |
| 1246 | a big <code>struct</code> for instance, it will be much cheaper to |
| 1247 | use a pointer receiver. |
| 1248 | </p> |
| 1249 | |
| 1250 | <p> |
| 1251 | Next is consistency. If some of the methods of the type must have |
| 1252 | pointer receivers, the rest should too, so the method set is |
| 1253 | consistent regardless of how the type is used. |
| 1254 | See the section on <a href="#different_method_sets">method sets</a> |
| 1255 | for details. |
| 1256 | </p> |
| 1257 | |
| 1258 | <p> |
| 1259 | For types such as basic types, slices, and small <code>structs</code>, |
| 1260 | a value receiver is very cheap so unless the semantics of the method |
| 1261 | requires a pointer, a value receiver is efficient and clear. |
| 1262 | </p> |
| 1263 | |
| 1264 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1265 | <h3 id="new_and_make"> |
| 1266 | What's the difference between new and make?</h3> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1267 | |
| 1268 | <p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1269 | In short: <code>new</code> allocates memory, <code>make</code> initializes |
| 1270 | the slice, map, and channel types. |
| 1271 | </p> |
| 1272 | |
| 1273 | <p> |
| 1274 | See the <a href="/doc/effective_go.html#allocation_new">relevant section |
| 1275 | of Effective Go</a> for more details. |
| 1276 | </p> |
| 1277 | |
Andrew Gerrand | affd1ba | 2010-12-09 08:59:29 +1100 | [diff] [blame] | 1278 | <h3 id="q_int_sizes"> |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 1279 | What is the size of an <code>int</code> on a 64 bit machine?</h3> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1280 | |
| 1281 | <p> |
Rob Pike | 80e25fc | 2011-01-19 23:07:38 -0500 | [diff] [blame] | 1282 | The sizes of <code>int</code> and <code>uint</code> are implementation-specific |
| 1283 | but the same as each other on a given platform. |
Russ Cox | 10ea651 | 2012-09-24 20:57:01 -0400 | [diff] [blame] | 1284 | For portability, code that relies on a particular |
Rob Pike | 80e25fc | 2011-01-19 23:07:38 -0500 | [diff] [blame] | 1285 | size of value should use an explicitly sized type, like <code>int64</code>. |
Russ Cox | 10ea651 | 2012-09-24 20:57:01 -0400 | [diff] [blame] | 1286 | Prior to Go 1.1, the 64-bit Go compilers (both gc and gccgo) used |
| 1287 | a 32-bit representation for <code>int</code>. As of Go 1.1 they use |
| 1288 | a 64-bit representation. |
Terrel Shumway | fcb45e7 | 2016-08-30 07:58:52 -0600 | [diff] [blame] | 1289 | </p> |
| 1290 | |
| 1291 | <p> |
Rob Pike | 80e25fc | 2011-01-19 23:07:38 -0500 | [diff] [blame] | 1292 | On the other hand, floating-point scalars and complex |
Terrel Shumway | fcb45e7 | 2016-08-30 07:58:52 -0600 | [diff] [blame] | 1293 | types are always sized (there are no <code>float</code> or <code>complex</code> basic types), |
| 1294 | because programmers should be aware of precision when using floating-point numbers. |
| 1295 | The default type used for an (untyped) floating-point constant is <code>float64</code>. |
Robert Griesemer | 6ebacf1 | 2016-08-30 17:09:30 -0700 | [diff] [blame] | 1296 | Thus <code>foo</code> <code>:=</code> <code>3.0</code> declares a variable <code>foo</code> |
| 1297 | of type <code>float64</code>. |
| 1298 | For a <code>float32</code> variable initialized by an (untyped) constant, the variable type |
| 1299 | must be specified explicitly in the variable declaration: |
| 1300 | </p> |
| 1301 | |
| 1302 | <pre> |
| 1303 | var foo float32 = 3.0 |
| 1304 | </pre> |
| 1305 | |
| 1306 | <p> |
| 1307 | Alternatively, the constant must be given a type with a conversion as in |
| 1308 | <code>foo := float32(3.0)</code>. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1309 | </p> |
| 1310 | |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1311 | <h3 id="stack_or_heap"> |
| 1312 | How do I know whether a variable is allocated on the heap or the stack?</h3> |
| 1313 | |
| 1314 | <p> |
| 1315 | From a correctness standpoint, you don't need to know. |
| 1316 | Each variable in Go exists as long as there are references to it. |
| 1317 | The storage location chosen by the implementation is irrelevant to the |
| 1318 | semantics of the language. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1319 | </p> |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1320 | |
| 1321 | <p> |
| 1322 | The storage location does have an effect on writing efficient programs. |
| 1323 | When possible, the Go compilers will allocate variables that are |
| 1324 | local to a function in that function's stack frame. However, if the |
| 1325 | compiler cannot prove that the variable is not referenced after the |
| 1326 | function returns, then the compiler must allocate the variable on the |
| 1327 | garbage-collected heap to avoid dangling pointer errors. |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1328 | Also, if a local variable is very large, it might make more sense |
| 1329 | to store it on the heap rather than the stack. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1330 | </p> |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1331 | |
| 1332 | <p> |
Rob Pike | 8649444 | 2011-11-08 16:26:03 -0800 | [diff] [blame] | 1333 | In the current compilers, if a variable has its address taken, that variable |
| 1334 | is a candidate for allocation on the heap. However, a basic <em>escape |
| 1335 | analysis</em> recognizes some cases when such variables will not |
| 1336 | live past the return from the function and can reside on the stack. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1337 | </p> |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1338 | |
Andrew Gerrand | 2100947 | 2012-10-11 14:21:19 +1100 | [diff] [blame] | 1339 | <h3 id="Why_does_my_Go_process_use_so_much_virtual_memory"> |
| 1340 | Why does my Go process use so much virtual memory?</h3> |
| 1341 | |
| 1342 | <p> |
| 1343 | The Go memory allocator reserves a large region of virtual memory as an arena |
| 1344 | for allocations. This virtual memory is local to the specific Go process; the |
| 1345 | reservation does not deprive other processes of memory. |
| 1346 | </p> |
| 1347 | |
| 1348 | <p> |
| 1349 | To find the amount of actual memory allocated to a Go process, use the Unix |
| 1350 | <code>top</code> command and consult the <code>RES</code> (Linux) or |
| 1351 | <code>RSIZE</code> (Mac OS X) columns. |
| 1352 | <!-- TODO(adg): find out how this works on Windows --> |
| 1353 | </p> |
| 1354 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1355 | <h2 id="Concurrency">Concurrency</h2> |
| 1356 | |
| 1357 | <h3 id="What_operations_are_atomic_What_about_mutexes"> |
| 1358 | What operations are atomic? What about mutexes?</h3> |
| 1359 | |
| 1360 | <p> |
| 1361 | We haven't fully defined it all yet, but some details about atomicity are |
Andrew Gerrand | 48ba6fe | 2013-10-04 09:45:06 +1000 | [diff] [blame] | 1362 | available in the <a href="/ref/mem">Go Memory Model specification</a>. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1363 | </p> |
| 1364 | |
| 1365 | <p> |
| 1366 | Regarding mutexes, the <a href="/pkg/sync">sync</a> |
| 1367 | package implements them, but we hope Go programming style will |
| 1368 | encourage people to try higher-level techniques. In particular, consider |
| 1369 | structuring your program so that only one goroutine at a time is ever |
| 1370 | responsible for a particular piece of data. |
| 1371 | </p> |
| 1372 | |
| 1373 | <p> |
| 1374 | Do not communicate by sharing memory. Instead, share memory by communicating. |
| 1375 | </p> |
| 1376 | |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 1377 | <p> |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1378 | See the <a href="/doc/codewalk/sharemem/">Share Memory By Communicating</a> code walk and its <a href="//blog.golang.org/2010/07/share-memory-by-communicating.html">associated article</a> for a detailed discussion of this concept. |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 1379 | </p> |
| 1380 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1381 | <h3 id="Why_no_multi_CPU"> |
| 1382 | Why doesn't my multi-goroutine program use multiple CPUs?</h3> |
| 1383 | |
| 1384 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1385 | The number of CPUs available simultaneously to executing goroutines is |
| 1386 | controlled by the <code>GOMAXPROCS</code> shell environment variable. |
| 1387 | In earlier releases of Go, the default value was 1, but as of Go 1.5 the default |
| 1388 | value is the number of cores available. |
Rob Pike | c97e73d | 2015-06-29 15:43:42 +1000 | [diff] [blame] | 1389 | Therefore programs compiled after 1.5 should demonstrate parallel execution |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1390 | of multiple goroutines. |
| 1391 | To change the behavior, set the environment variable or use the similarly-named |
| 1392 | <a href="/pkg/runtime/#GOMAXPROCS">function</a> |
| 1393 | of the runtime package to configure the |
| 1394 | run-time support to utilize a different number of threads. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1395 | </p> |
| 1396 | |
| 1397 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1398 | Programs that perform parallel computation might benefit from a further increase in |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1399 | <code>GOMAXPROCS</code>. |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 1400 | However, be aware that |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1401 | <a href="//blog.golang.org/2013/01/concurrency-is-not-parallelism.html">concurrency |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 1402 | is not parallelism</a>. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1403 | </p> |
| 1404 | |
| 1405 | <h3 id="Why_GOMAXPROCS"> |
| 1406 | Why does using <code>GOMAXPROCS</code> > 1 sometimes make my program |
| 1407 | slower?</h3> |
| 1408 | |
| 1409 | <p> |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1410 | It depends on the nature of your program. |
Rob Pike | 01afb79 | 2012-01-26 14:44:38 -0800 | [diff] [blame] | 1411 | Problems that are intrinsically sequential cannot be sped up by adding |
| 1412 | more goroutines. |
| 1413 | Concurrency only becomes parallelism when the problem is |
| 1414 | intrinsically parallel. |
| 1415 | </p> |
| 1416 | |
| 1417 | <p> |
| 1418 | In practical terms, programs that spend more time |
| 1419 | communicating on channels than doing computation |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1420 | may experience performance degradation when using |
Rob Pike | 01afb79 | 2012-01-26 14:44:38 -0800 | [diff] [blame] | 1421 | multiple OS threads. |
| 1422 | This is because sending data between threads involves switching |
| 1423 | contexts, which has significant cost. |
Andrew Gerrand | 48ba6fe | 2013-10-04 09:45:06 +1000 | [diff] [blame] | 1424 | For instance, the <a href="/ref/spec#An_example_package">prime sieve example</a> |
Rob Pike | 01afb79 | 2012-01-26 14:44:38 -0800 | [diff] [blame] | 1425 | from the Go specification has no significant parallelism although it launches many |
| 1426 | goroutines; increasing <code>GOMAXPROCS</code> is more likely to slow it down than |
| 1427 | to speed it up. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1428 | </p> |
| 1429 | |
| 1430 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1431 | Go's goroutine scheduler is not as good as it needs to be, although it |
| 1432 | has improved in recent releases. |
| 1433 | In the future, it may better optimize its use of OS threads. |
| 1434 | For now, if there are performance issues, |
| 1435 | setting <code>GOMAXPROCS</code> on a per-application basis may help. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1436 | </p> |
| 1437 | |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 1438 | <p> |
| 1439 | For more detail on this topic see the talk entitled, |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1440 | <a href="//blog.golang.org/2013/01/concurrency-is-not-parallelism.html">Concurrency |
Rob Pike | 48ecfc9 | 2013-03-27 15:26:57 -0700 | [diff] [blame] | 1441 | is not Parallelism</a>. |
| 1442 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1443 | <h2 id="Functions_methods">Functions and Methods</h2> |
| 1444 | |
| 1445 | <h3 id="different_method_sets"> |
| 1446 | Why do T and *T have different method sets?</h3> |
| 1447 | |
| 1448 | <p> |
Andrew Gerrand | 48ba6fe | 2013-10-04 09:45:06 +1000 | [diff] [blame] | 1449 | From the <a href="/ref/spec#Types">Go Spec</a>: |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1450 | </p> |
| 1451 | |
| 1452 | <blockquote> |
| 1453 | The method set of any other named type <code>T</code> consists of all methods |
| 1454 | with receiver type <code>T</code>. The method set of the corresponding pointer |
| 1455 | type <code>*T</code> is the set of all methods with receiver <code>*T</code> or |
| 1456 | <code>T</code> (that is, it also contains the method set of <code>T</code>). |
| 1457 | </blockquote> |
| 1458 | |
| 1459 | <p> |
| 1460 | If an interface value contains a pointer <code>*T</code>, |
| 1461 | a method call can obtain a value by dereferencing the pointer, |
| 1462 | but if an interface value contains a value <code>T</code>, |
| 1463 | there is no useful way for a method call to obtain a pointer. |
| 1464 | </p> |
| 1465 | |
| 1466 | <p> |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1467 | Even in cases where the compiler could take the address of a value |
| 1468 | to pass to the method, if the method modifies the value the changes |
| 1469 | will be lost in the caller. |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1470 | As an example, if the <code>Write</code> method of |
| 1471 | <a href="/pkg/bytes/#Buffer"><code>bytes.Buffer</code></a> |
| 1472 | used a value receiver rather than a pointer, |
| 1473 | this code: |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1474 | </p> |
| 1475 | |
| 1476 | <pre> |
| 1477 | var buf bytes.Buffer |
| 1478 | io.Copy(buf, os.Stdin) |
| 1479 | </pre> |
| 1480 | |
| 1481 | <p> |
| 1482 | would copy standard input into a <i>copy</i> of <code>buf</code>, |
| 1483 | not into <code>buf</code> itself. |
| 1484 | This is almost never the desired behavior. |
| 1485 | </p> |
| 1486 | |
| 1487 | <h3 id="closures_and_goroutines"> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1488 | What happens with closures running as goroutines?</h3> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1489 | |
| 1490 | <p> |
| 1491 | Some confusion may arise when using closures with concurrency. |
| 1492 | Consider the following program: |
| 1493 | </p> |
| 1494 | |
| 1495 | <pre> |
| 1496 | func main() { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1497 | done := make(chan bool) |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1498 | |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1499 | values := []string{"a", "b", "c"} |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1500 | for _, v := range values { |
| 1501 | go func() { |
| 1502 | fmt.Println(v) |
| 1503 | done <- true |
| 1504 | }() |
| 1505 | } |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1506 | |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1507 | // wait for all goroutines to complete before exiting |
| 1508 | for _ = range values { |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1509 | <-done |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1510 | } |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1511 | } |
| 1512 | </pre> |
| 1513 | |
| 1514 | <p> |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1515 | One might mistakenly expect to see <code>a, b, c</code> as the output. |
| 1516 | What you'll probably see instead is <code>c, c, c</code>. This is because |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1517 | each iteration of the loop uses the same instance of the variable <code>v</code>, so |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1518 | each closure shares that single variable. When the closure runs, it prints the |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1519 | value of <code>v</code> at the time <code>fmt.Println</code> is executed, |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1520 | but <code>v</code> may have been modified since the goroutine was launched. |
Christian Himpel | 89ed40c | 2012-11-12 07:25:54 -0800 | [diff] [blame] | 1521 | To help detect this and other problems before they happen, run |
Dmitriy Vyukov | 2e1ddeb | 2014-05-07 18:49:13 +0400 | [diff] [blame] | 1522 | <a href="/cmd/go/#hdr-Run_go_tool_vet_on_packages"><code>go vet</code></a>. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1523 | </p> |
| 1524 | |
| 1525 | <p> |
Rob Pike | 0cab7d5 | 2012-09-07 09:11:39 -0700 | [diff] [blame] | 1526 | To bind the current value of <code>v</code> to each closure as it is launched, one |
| 1527 | must modify the inner loop to create a new variable each iteration. |
| 1528 | One way is to pass the variable as an argument to the closure: |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1529 | </p> |
| 1530 | |
| 1531 | <pre> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1532 | for _, v := range values { |
| 1533 | go func(<b>u</b> string) { |
| 1534 | fmt.Println(<b>u</b>) |
| 1535 | done <- true |
| 1536 | }(<b>v</b>) |
| 1537 | } |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1538 | </pre> |
| 1539 | |
| 1540 | <p> |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1541 | In this example, the value of <code>v</code> is passed as an argument to the |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1542 | anonymous function. That value is then accessible inside the function as |
| 1543 | the variable <code>u</code>. |
| 1544 | </p> |
| 1545 | |
Rob Pike | 0cab7d5 | 2012-09-07 09:11:39 -0700 | [diff] [blame] | 1546 | <p> |
| 1547 | Even easier is just to create a new variable, using a declaration style that may |
| 1548 | seem odd but works fine in Go: |
| 1549 | </p> |
| 1550 | |
| 1551 | <pre> |
| 1552 | for _, v := range values { |
| 1553 | <b>v := v</b> // create a new 'v'. |
| 1554 | go func() { |
| 1555 | fmt.Println(<b>v</b>) |
| 1556 | done <- true |
| 1557 | }() |
| 1558 | } |
| 1559 | </pre> |
| 1560 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1561 | <h2 id="Control_flow">Control flow</h2> |
| 1562 | |
| 1563 | <h3 id="Does_Go_have_a_ternary_form"> |
| 1564 | Does Go have the <code>?:</code> operator?</h3> |
| 1565 | |
| 1566 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1567 | There is no ternary testing operation in Go. You may use the following to achieve the same |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1568 | result: |
| 1569 | </p> |
| 1570 | |
| 1571 | <pre> |
| 1572 | if expr { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1573 | n = trueVal |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1574 | } else { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1575 | n = falseVal |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1576 | } |
| 1577 | </pre> |
| 1578 | |
| 1579 | <h2 id="Packages_Testing">Packages and Testing</h2> |
| 1580 | |
| 1581 | <h3 id="How_do_I_create_a_multifile_package"> |
| 1582 | How do I create a multifile package?</h3> |
| 1583 | |
| 1584 | <p> |
| 1585 | Put all the source files for the package in a directory by themselves. |
| 1586 | Source files can refer to items from different files at will; there is |
| 1587 | no need for forward declarations or a header file. |
| 1588 | </p> |
| 1589 | |
| 1590 | <p> |
| 1591 | Other than being split into multiple files, the package will compile and test |
| 1592 | just like a single-file package. |
| 1593 | </p> |
| 1594 | |
| 1595 | <h3 id="How_do_I_write_a_unit_test"> |
| 1596 | How do I write a unit test?</h3> |
| 1597 | |
| 1598 | <p> |
| 1599 | Create a new file ending in <code>_test.go</code> in the same directory |
| 1600 | as your package sources. Inside that file, <code>import "testing"</code> |
| 1601 | and write functions of the form |
| 1602 | </p> |
| 1603 | |
| 1604 | <pre> |
| 1605 | func TestFoo(t *testing.T) { |
| 1606 | ... |
| 1607 | } |
| 1608 | </pre> |
| 1609 | |
| 1610 | <p> |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1611 | Run <code>go test</code> in that directory. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1612 | That script finds the <code>Test</code> functions, |
| 1613 | builds a test binary, and runs it. |
| 1614 | </p> |
| 1615 | |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1616 | <p>See the <a href="/doc/code.html">How to Write Go Code</a> document, |
| 1617 | the <a href="/pkg/testing/"><code>testing</code></a> package |
Andrew Gerrand | 399a36a | 2013-01-15 19:25:16 +1100 | [diff] [blame] | 1618 | and the <a href="/cmd/go/#hdr-Test_packages"><code>go test</code></a> subcommand for more details. |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1619 | </p> |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 1620 | |
Rob Pike | f6615f1 | 2011-11-09 13:19:23 -0800 | [diff] [blame] | 1621 | <h3 id="testing_framework"> |
| 1622 | Where is my favorite helper function for testing?</h3> |
| 1623 | |
| 1624 | <p> |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1625 | Go's standard <a href="/pkg/testing/"><code>testing</code></a> package makes it easy to write unit tests, but it lacks |
Rob Pike | f6615f1 | 2011-11-09 13:19:23 -0800 | [diff] [blame] | 1626 | features provided in other language's testing frameworks such as assertion functions. |
| 1627 | An <a href="#assertions">earlier section</a> of this document explained why Go |
| 1628 | doesn't have assertions, and |
| 1629 | the same arguments apply to the use of <code>assert</code> in tests. |
| 1630 | Proper error handling means letting other tests run after one has failed, so |
| 1631 | that the person debugging the failure gets a complete picture of what is |
| 1632 | wrong. It is more useful for a test to report that |
| 1633 | <code>isPrime</code> gives the wrong answer for 2, 3, 5, and 7 (or for |
| 1634 | 2, 4, 8, and 16) than to report that <code>isPrime</code> gives the wrong |
| 1635 | answer for 2 and therefore no more tests were run. The programmer who |
| 1636 | triggers the test failure may not be familiar with the code that fails. |
| 1637 | Time invested writing a good error message now pays off later when the |
| 1638 | test breaks. |
| 1639 | </p> |
| 1640 | |
| 1641 | <p> |
| 1642 | A related point is that testing frameworks tend to develop into mini-languages |
| 1643 | of their own, with conditionals and controls and printing mechanisms, |
| 1644 | but Go already has all those capabilities; why recreate them? |
| 1645 | We'd rather write tests in Go; it's one fewer language to learn and the |
| 1646 | approach keeps the tests straightforward and easy to understand. |
| 1647 | </p> |
| 1648 | |
| 1649 | <p> |
| 1650 | If the amount of extra code required to write |
| 1651 | good errors seems repetitive and overwhelming, the test might work better if |
| 1652 | table-driven, iterating over a list of inputs and outputs defined |
| 1653 | in a data structure (Go has excellent support for data structure literals). |
| 1654 | The work to write a good test and good error messages will then be amortized over many |
| 1655 | test cases. The standard Go library is full of illustrative examples, such as in |
Russ Cox | 220a6de | 2014-09-08 00:06:45 -0400 | [diff] [blame] | 1656 | <a href="/src/fmt/fmt_test.go">the formatting tests for the <code>fmt</code> package</a>. |
Rob Pike | f6615f1 | 2011-11-09 13:19:23 -0800 | [diff] [blame] | 1657 | </p> |
| 1658 | |
Brad Fitzpatrick | 8a28242 | 2015-07-05 10:00:14 -0700 | [diff] [blame] | 1659 | <h3 id="x_in_std"> |
| 1660 | Why isn't <i>X</i> in the standard library?</h3> |
| 1661 | |
| 1662 | <p> |
| 1663 | The standard library's purpose is to support the runtime, connect to |
| 1664 | the operating system, and provide key functionality that many Go |
| 1665 | programs require, such as formatted I/O and networking. |
| 1666 | It also contains elements important for web programming, including |
| 1667 | cryptography and support for standards like HTTP, JSON, and XML. |
| 1668 | </p> |
| 1669 | |
| 1670 | <p> |
| 1671 | There is no clear criterion that defines what is included because for |
| 1672 | a long time, this was the <i>only</i> Go library. |
| 1673 | There are criteria that define what gets added today, however. |
| 1674 | </p> |
| 1675 | |
| 1676 | <p> |
| 1677 | New additions to the standard library are rare and the bar for |
| 1678 | inclusion is high. |
| 1679 | Code included in the standard library bears a large ongoing maintenance cost |
| 1680 | (often borne by those other than the original author), |
| 1681 | is subject to the <a href="/doc/go1compat.html">Go 1 compatibility promise</a> |
| 1682 | (blocking fixes to any flaws in the API), |
| 1683 | and is subject to the Go |
| 1684 | <a href="https://golang.org/s/releasesched">release schedule</a>, |
| 1685 | preventing bug fixes from being available to users quickly. |
| 1686 | </p> |
| 1687 | |
| 1688 | <p> |
| 1689 | Most new code should live outside of the standard library and be accessible |
| 1690 | via the <a href="/cmd/go/"><code>go</code> tool</a>'s |
| 1691 | <code>go get</code> command. |
| 1692 | Such code can have its own maintainers, release cycle, |
| 1693 | and compatibility guarantees. |
| 1694 | Users can find packages and read their documentation at |
| 1695 | <a href="https://godoc.org/">godoc.org</a>. |
| 1696 | </p> |
| 1697 | |
| 1698 | <p> |
| 1699 | Although there are pieces in the standard library that don't really belong, |
| 1700 | such as <code>log/syslog</code>, we continue to maintain everything in the |
| 1701 | library because of the Go 1 compatibility promise. |
| 1702 | But we encourage most new code to live elsewhere. |
| 1703 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1704 | |
| 1705 | <h2 id="Implementation">Implementation</h2> |
| 1706 | |
| 1707 | <h3 id="What_compiler_technology_is_used_to_build_the_compilers"> |
| 1708 | What compiler technology is used to build the compilers?</h3> |
| 1709 | |
| 1710 | <p> |
Mike Rosset | b4afe88 | 2013-03-12 17:12:56 -0700 | [diff] [blame] | 1711 | <code>Gccgo</code> has a front end written in C++, with a recursive descent parser coupled to the |
Brad Fitzpatrick | dea6dab | 2016-08-18 15:50:30 +0000 | [diff] [blame] | 1712 | standard GCC back end. <code>Gc</code> is written in Go with a recursive descent parser |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1713 | and uses a custom loader, also written in Go but |
| 1714 | based on the Plan 9 loader, to generate ELF/Mach-O/PE binaries. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1715 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1716 | |
| 1717 | <p> |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1718 | We considered using LLVM for <code>gc</code> but we felt it was too large and |
| 1719 | slow to meet our performance goals. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1720 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1721 | |
| 1722 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1723 | The original <code>gc</code>, the Go compiler, was written in C |
| 1724 | because of the difficulties of bootstrapping—you'd need a Go compiler to |
| 1725 | set up a Go environment. |
| 1726 | But things have advanced and as of Go 1.5 the compiler is written in Go. |
| 1727 | It was converted from C to Go using automatic translation tools, as |
| 1728 | described in <a href="/s/go13compiler">this design document</a> |
| 1729 | and <a href="https://talks.golang.org/2015/gogo.slide#1">a recent talk</a>. |
| 1730 | Thus the compiler is now "self-hosting", which means we must face |
| 1731 | the bootstrapping problem. |
| 1732 | The solution, naturally, is to have a working Go installation already, |
| 1733 | just as one normally has a working C installation in place. |
| 1734 | The story of how to bring up a new Go installation from source |
| 1735 | is described <a href="/s/go15bootstrap">separately</a>. |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1736 | </p> |
| 1737 | |
| 1738 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1739 | Go is a fine language in which to implement a Go compiler. |
| 1740 | Although <code>gc</code> does not use them (yet?), a native lexer and |
| 1741 | parser are available in the <a href="/pkg/go/"><code>go</code></a> package |
| 1742 | and there is also a <a href="/pkg/go/types">type checker</a>. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1743 | </p> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1744 | |
Rob Pike | 966bf71 | 2011-03-01 13:54:22 -0800 | [diff] [blame] | 1745 | <h3 id="How_is_the_run_time_support_implemented"> |
| 1746 | How is the run-time support implemented?</h3> |
Russ Cox | 3227445 | 2009-10-22 00:13:51 -0700 | [diff] [blame] | 1747 | |
| 1748 | <p> |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1749 | Again due to bootstrapping issues, the run-time code was originally written mostly in C (with a |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1750 | tiny bit of assembler) but it has since been translated to Go |
| 1751 | (except for some assembler bits). |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1752 | <code>Gccgo</code>'s run-time support uses <code>glibc</code>. |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1753 | The <code>gccgo</code> compiler implements goroutines using |
| 1754 | a technique called segmented stacks, |
Rob Pike | 287967f | 2014-03-21 13:59:30 +1100 | [diff] [blame] | 1755 | supported by recent modifications to the gold linker. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1756 | </p> |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 1757 | |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1758 | <h3 id="Why_is_my_trivial_program_such_a_large_binary"> |
| 1759 | Why is my trivial program such a large binary?</h3> |
| 1760 | |
| 1761 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1762 | The linker in the <code>gc</code> tool chain |
| 1763 | creates statically-linked binaries by default. All Go binaries therefore include the Go |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1764 | run-time, along with the run-time type information necessary to support dynamic |
| 1765 | type checks, reflection, and even panic-time stack traces. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1766 | </p> |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1767 | |
| 1768 | <p> |
Rob Pike | 0130a31 | 2012-03-07 15:29:26 +1100 | [diff] [blame] | 1769 | A simple C "hello, world" program compiled and linked statically using gcc |
| 1770 | on Linux is around 750 kB, |
| 1771 | including an implementation of <code>printf</code>. |
| 1772 | An equivalent Go program using <code>fmt.Printf</code> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 1773 | is around 2.3 MB, but |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1774 | that includes more powerful run-time support and type information. |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1775 | </p> |
Andrew Gerrand | 4b0ecd3 | 2011-03-01 21:35:46 +1100 | [diff] [blame] | 1776 | |
Rob Pike | 7d87f3d | 2011-08-06 11:21:59 +1000 | [diff] [blame] | 1777 | <h3 id="unused_variables_and_imports"> |
| 1778 | Can I stop these complaints about my unused variable/import?</h3> |
| 1779 | |
| 1780 | <p> |
| 1781 | The presence of an unused variable may indicate a bug, while |
Rob Pike | dba2faf | 2014-10-01 15:25:56 -0700 | [diff] [blame] | 1782 | unused imports just slow down compilation, |
| 1783 | an effect that can become substantial as a program accumulates |
| 1784 | code and programmers over time. |
| 1785 | For these reasons, Go refuses to compile programs with unused |
| 1786 | variables or imports, |
| 1787 | trading short-term convenience for long-term build speed and |
| 1788 | program clarity. |
Rob Pike | 7d87f3d | 2011-08-06 11:21:59 +1000 | [diff] [blame] | 1789 | </p> |
| 1790 | |
| 1791 | <p> |
Rob Pike | dba2faf | 2014-10-01 15:25:56 -0700 | [diff] [blame] | 1792 | Still, when developing code, it's common to create these situations |
Rob Pike | 7d87f3d | 2011-08-06 11:21:59 +1000 | [diff] [blame] | 1793 | temporarily and it can be annoying to have to edit them out before the |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1794 | program will compile. |
Rob Pike | 7d87f3d | 2011-08-06 11:21:59 +1000 | [diff] [blame] | 1795 | </p> |
| 1796 | |
| 1797 | <p> |
| 1798 | Some have asked for a compiler option to turn those checks off |
| 1799 | or at least reduce them to warnings. |
| 1800 | Such an option has not been added, though, |
| 1801 | because compiler options should not affect the semantics of the |
| 1802 | language and because the Go compiler does not report warnings, only |
| 1803 | errors that prevent compilation. |
| 1804 | </p> |
| 1805 | |
| 1806 | <p> |
| 1807 | There are two reasons for having no warnings. First, if it's worth |
| 1808 | complaining about, it's worth fixing in the code. (And if it's not |
| 1809 | worth fixing, it's not worth mentioning.) Second, having the compiler |
| 1810 | generate warnings encourages the implementation to warn about weak |
| 1811 | cases that can make compilation noisy, masking real errors that |
| 1812 | <em>should</em> be fixed. |
| 1813 | </p> |
| 1814 | |
| 1815 | <p> |
| 1816 | It's easy to address the situation, though. Use the blank identifier |
| 1817 | to let unused things persist while you're developing. |
| 1818 | </p> |
| 1819 | |
| 1820 | <pre> |
| 1821 | import "unused" |
| 1822 | |
| 1823 | // This declaration marks the import as used by referencing an |
| 1824 | // item from the package. |
| 1825 | var _ = unused.Item // TODO: Delete before committing! |
| 1826 | |
| 1827 | func main() { |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1828 | debugData := debug.Profile() |
| 1829 | _ = debugData // Used only during debugging. |
| 1830 | .... |
Rob Pike | 7d87f3d | 2011-08-06 11:21:59 +1000 | [diff] [blame] | 1831 | } |
| 1832 | </pre> |
| 1833 | |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1834 | <p> |
| 1835 | Nowadays, most Go programmers use a tool, |
Andrew Gerrand | 7f0be1f | 2014-11-10 09:15:57 +1100 | [diff] [blame] | 1836 | <a href="http://godoc.org/golang.org/x/tools/cmd/goimports">goimports</a>, |
Rob Pike | 56c4d0a | 2014-09-27 11:56:54 -0700 | [diff] [blame] | 1837 | which automatically rewrites a Go source file to have the correct imports, |
| 1838 | eliminating the unused imports issue in practice. |
| 1839 | This program is easily connected to most editors to run automatically when a Go source file is written. |
| 1840 | </p> |
| 1841 | |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 1842 | <h2 id="Performance">Performance</h2> |
| 1843 | |
| 1844 | <h3 id="Why_does_Go_perform_badly_on_benchmark_x"> |
| 1845 | Why does Go perform badly on benchmark X?</h3> |
| 1846 | |
| 1847 | <p> |
| 1848 | One of Go's design goals is to approach the performance of C for comparable |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1849 | programs, yet on some benchmarks it does quite poorly, including several |
Shenghou Ma | 7a05fa8 | 2016-03-10 02:36:28 -0500 | [diff] [blame] | 1850 | in <a href="https://go.googlesource.com/exp/+/master/shootout/">golang.org/x/exp/shootout</a>. |
| 1851 | The slowest depend on libraries for which versions of comparable performance |
| 1852 | are not available in Go. |
| 1853 | For instance, <a href="https://go.googlesource.com/exp/+/master/shootout/pidigits.go">pidigits.go</a> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1854 | depends on a multi-precision math package, and the C |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 1855 | versions, unlike Go's, use <a href="http://gmplib.org/">GMP</a> (which is |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1856 | written in optimized assembler). |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1857 | Benchmarks that depend on regular expressions |
Shenghou Ma | 7a05fa8 | 2016-03-10 02:36:28 -0500 | [diff] [blame] | 1858 | (<a href="https://go.googlesource.com/exp/+/master/shootout/regex-dna.go">regex-dna.go</a>, |
| 1859 | for instance) are essentially comparing Go's native <a href="/pkg/regexp">regexp package</a> to |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 1860 | mature, highly optimized regular expression libraries like PCRE. |
| 1861 | </p> |
| 1862 | |
| 1863 | <p> |
| 1864 | Benchmark games are won by extensive tuning and the Go versions of most |
| 1865 | of the benchmarks need attention. If you measure comparable C |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1866 | and Go programs |
Shenghou Ma | 7a05fa8 | 2016-03-10 02:36:28 -0500 | [diff] [blame] | 1867 | (<a href="https://go.googlesource.com/exp/+/master/shootout/reverse-complement.go">reverse-complement.go</a> |
| 1868 | is one example), you'll see the two languages are much closer in raw performance |
| 1869 | than this suite would indicate. |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 1870 | </p> |
| 1871 | |
| 1872 | <p> |
| 1873 | Still, there is room for improvement. The compilers are good but could be |
Andrew Gerrand | 0542774 | 2010-04-23 10:02:10 +1000 | [diff] [blame] | 1874 | better, many libraries need major performance work, and the garbage collector |
Oling Cat | 018e89f | 2013-01-24 20:46:33 +1100 | [diff] [blame] | 1875 | isn't fast enough yet. (Even if it were, taking care not to generate unnecessary |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1876 | garbage can have a huge effect.) |
Andrew Gerrand | 0857573 | 2010-04-21 14:00:56 +1000 | [diff] [blame] | 1877 | </p> |
| 1878 | |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1879 | <p> |
Rob Pike | 5cff190 | 2012-02-20 12:42:50 +1100 | [diff] [blame] | 1880 | In any case, Go can often be very competitive. |
| 1881 | There has been significant improvement in the performance of many programs |
| 1882 | as the language and tools have developed. |
| 1883 | See the blog post about |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 1884 | <a href="//blog.golang.org/2011/06/profiling-go-programs.html">profiling |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1885 | Go programs</a> for an informative example. |
| 1886 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1887 | <h2 id="change_from_c">Changes from C</h2> |
| 1888 | |
| 1889 | <h3 id="different_syntax"> |
| 1890 | Why is the syntax so different from C?</h3> |
| 1891 | <p> |
| 1892 | Other than declaration syntax, the differences are not major and stem |
| 1893 | from two desires. First, the syntax should feel light, without too |
| 1894 | many mandatory keywords, repetition, or arcana. Second, the language |
| 1895 | has been designed to be easy to analyze |
| 1896 | and can be parsed without a symbol table. This makes it much easier |
| 1897 | to build tools such as debuggers, dependency analyzers, automated |
| 1898 | documentation extractors, IDE plug-ins, and so on. C and its |
| 1899 | descendants are notoriously difficult in this regard. |
| 1900 | </p> |
| 1901 | |
| 1902 | <h3 id="declarations_backwards"> |
| 1903 | Why are declarations backwards?</h3> |
| 1904 | <p> |
| 1905 | They're only backwards if you're used to C. In C, the notion is that a |
| 1906 | variable is declared like an expression denoting its type, which is a |
| 1907 | nice idea, but the type and expression grammars don't mix very well and |
| 1908 | the results can be confusing; consider function pointers. Go mostly |
| 1909 | separates expression and type syntax and that simplifies things (using |
| 1910 | prefix <code>*</code> for pointers is an exception that proves the rule). In C, |
| 1911 | the declaration |
| 1912 | </p> |
| 1913 | <pre> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1914 | int* a, b; |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1915 | </pre> |
| 1916 | <p> |
| 1917 | declares <code>a</code> to be a pointer but not <code>b</code>; in Go |
| 1918 | </p> |
| 1919 | <pre> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1920 | var a, b *int |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1921 | </pre> |
| 1922 | <p> |
| 1923 | declares both to be pointers. This is clearer and more regular. |
| 1924 | Also, the <code>:=</code> short declaration form argues that a full variable |
| 1925 | declaration should present the same order as <code>:=</code> so |
| 1926 | </p> |
| 1927 | <pre> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1928 | var a uint64 = 1 |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1929 | </pre> |
Stefan Nilsson | c50074e | 2012-02-29 15:07:52 -0800 | [diff] [blame] | 1930 | <p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1931 | has the same effect as |
Stefan Nilsson | c50074e | 2012-02-29 15:07:52 -0800 | [diff] [blame] | 1932 | </p> |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1933 | <pre> |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 1934 | a := uint64(1) |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1935 | </pre> |
| 1936 | <p> |
| 1937 | Parsing is also simplified by having a distinct grammar for types that |
| 1938 | is not just the expression grammar; keywords such as <code>func</code> |
| 1939 | and <code>chan</code> keep things clear. |
| 1940 | </p> |
| 1941 | |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 1942 | <p> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1943 | See the article about |
Francisco Souza | 6033a48 | 2012-03-13 14:46:08 +1100 | [diff] [blame] | 1944 | <a href="/doc/articles/gos_declaration_syntax.html">Go's Declaration Syntax</a> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 1945 | for more details. |
Andrew Gerrand | 5ec55c5 | 2010-09-30 11:23:39 +1000 | [diff] [blame] | 1946 | </p> |
| 1947 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1948 | <h3 id="no_pointer_arithmetic"> |
| 1949 | Why is there no pointer arithmetic?</h3> |
| 1950 | <p> |
| 1951 | Safety. Without pointer arithmetic it's possible to create a |
| 1952 | language that can never derive an illegal address that succeeds |
| 1953 | incorrectly. Compiler and hardware technology have advanced to the |
| 1954 | point where a loop using array indices can be as efficient as a loop |
| 1955 | using pointer arithmetic. Also, the lack of pointer arithmetic can |
| 1956 | simplify the implementation of the garbage collector. |
| 1957 | </p> |
| 1958 | |
| 1959 | <h3 id="inc_dec"> |
| 1960 | Why are <code>++</code> and <code>--</code> statements and not expressions? And why postfix, not prefix?</h3> |
| 1961 | <p> |
| 1962 | Without pointer arithmetic, the convenience value of pre- and postfix |
| 1963 | increment operators drops. By removing them from the expression |
| 1964 | hierarchy altogether, expression syntax is simplified and the messy |
| 1965 | issues around order of evaluation of <code>++</code> and <code>--</code> |
| 1966 | (consider <code>f(i++)</code> and <code>p[i] = q[++i]</code>) |
| 1967 | are eliminated as well. The simplification is |
| 1968 | significant. As for postfix vs. prefix, either would work fine but |
| 1969 | the postfix version is more traditional; insistence on prefix arose |
| 1970 | with the STL, a library for a language whose name contains, ironically, a |
| 1971 | postfix increment. |
| 1972 | </p> |
| 1973 | |
| 1974 | <h3 id="semicolons"> |
| 1975 | Why are there braces but no semicolons? And why can't I put the opening |
| 1976 | brace on the next line?</h3> |
| 1977 | <p> |
| 1978 | Go uses brace brackets for statement grouping, a syntax familiar to |
| 1979 | programmers who have worked with any language in the C family. |
| 1980 | Semicolons, however, are for parsers, not for people, and we wanted to |
| 1981 | eliminate them as much as possible. To achieve this goal, Go borrows |
| 1982 | a trick from BCPL: the semicolons that separate statements are in the |
| 1983 | formal grammar but are injected automatically, without lookahead, by |
| 1984 | the lexer at the end of any line that could be the end of a statement. |
| 1985 | This works very well in practice but has the effect that it forces a |
| 1986 | brace style. For instance, the opening brace of a function cannot |
| 1987 | appear on a line by itself. |
| 1988 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 1989 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1990 | <p> |
| 1991 | Some have argued that the lexer should do lookahead to permit the |
| 1992 | brace to live on the next line. We disagree. Since Go code is meant |
| 1993 | to be formatted automatically by |
Shenghou Ma | 97b13ac | 2012-03-07 08:15:47 +1100 | [diff] [blame] | 1994 | <a href="/cmd/gofmt/"><code>gofmt</code></a>, |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 1995 | <i>some</i> style must be chosen. That style may differ from what |
| 1996 | you've used in C or Java, but Go is a new language and |
| 1997 | <code>gofmt</code>'s style is as good as any other. More |
| 1998 | important—much more important—the advantages of a single, |
| 1999 | programmatically mandated format for all Go programs greatly outweigh |
| 2000 | any perceived disadvantages of the particular style. |
| 2001 | Note too that Go's style means that an interactive implementation of |
| 2002 | Go can use the standard syntax one line at a time without special rules. |
| 2003 | </p> |
| 2004 | |
| 2005 | <h3 id="garbage_collection"> |
| 2006 | Why do garbage collection? Won't it be too expensive?</h3> |
| 2007 | <p> |
| 2008 | One of the biggest sources of bookkeeping in systems programs is |
| 2009 | memory management. We feel it's critical to eliminate that |
| 2010 | programmer overhead, and advances in garbage collection |
| 2011 | technology in the last few years give us confidence that we can |
| 2012 | implement it with low enough overhead and no significant |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 2013 | latency. |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 2014 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 2015 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 2016 | <p> |
| 2017 | Another point is that a large part of the difficulty of concurrent |
| 2018 | and multi-threaded programming is memory management; |
| 2019 | as objects get passed among threads it becomes cumbersome |
| 2020 | to guarantee they become freed safely. |
| 2021 | Automatic garbage collection makes concurrent code far easier to write. |
| 2022 | Of course, implementing garbage collection in a concurrent environment is |
| 2023 | itself a challenge, but meeting it once rather than in every |
| 2024 | program helps everyone. |
| 2025 | </p> |
Evan Shaw | 64d8576 | 2011-05-22 14:56:12 +1000 | [diff] [blame] | 2026 | |
Andrew Gerrand | 4164d60 | 2010-09-29 16:52:22 +1000 | [diff] [blame] | 2027 | <p> |
| 2028 | Finally, concurrency aside, garbage collection makes interfaces |
| 2029 | simpler because they don't need to specify how memory is managed across them. |
| 2030 | </p> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 2031 | |
| 2032 | <p> |
Rob Pike | 694b244 | 2015-06-29 13:27:41 +1000 | [diff] [blame] | 2033 | The current implementation is a parallel mark-and-sweep collector. |
| 2034 | Recent improvements, documented in |
| 2035 | <a href="/s/go14gc">this design document</a>, |
| 2036 | have introduced bounded pause times and improved the |
| 2037 | parallelism. |
| 2038 | Future versions might attempt new approaches. |
Rob Pike | fcfed14 | 2012-01-23 08:39:53 -0800 | [diff] [blame] | 2039 | </p> |
| 2040 | |
| 2041 | <p> |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 2042 | On the topic of performance, keep in mind that Go gives the programmer |
| 2043 | considerable control over memory layout and allocation, much more than |
| 2044 | is typical in garbage-collected languages. A careful programmer can reduce |
| 2045 | the garbage collection overhead dramatically by using the language well; |
| 2046 | see the article about |
Andrew Gerrand | 43ad89d | 2014-07-25 10:28:39 +1000 | [diff] [blame] | 2047 | <a href="//blog.golang.org/2011/06/profiling-go-programs.html">profiling |
Rob Pike | 93c4a24 | 2011-08-06 07:41:55 +1000 | [diff] [blame] | 2048 | Go programs</a> for a worked example, including a demonstration of Go's |
| 2049 | profiling tools. |
| 2050 | </p> |