Content and build toolchain for Go by Example, a site that teaches Go via annotated example programs.
The Go by Example site is built by extracting code and
comments from source files in examples
and rendering
them using templates
into a static public
directory. The programs implementing this build process
are in tools
, along with dependencies specified in
the go.mod
file.
The built public
directory can be served by any
static content system. The production site uses S3 and
CloudFront, for example.
To build the site you'll need Go installed. Run:
$ tools/build
To build continuously in a loop:
$ tools/build-loop
To see the site locally:
$ tools/serve
and open https://127.0.0.1:8000/
in your browser.
To upload the site:
$ export AWS_ACCESS_KEY_ID=...
$ export AWS_SECRET_ACCESS_KEY=...
$ tools/upload
This work is copyright Mark McGranaghan and licensed under a Creative Commons Attribution 3.0 Unported License.
The Go Gopher is copyright Renée French and licensed under a Creative Commons Attribution 3.0 Unported License.
Contributor translations of the Go by Example site are available in:
- Chinese by gobyexample-cn
- French by keirua
- Italian by the Go Italian community
- Japanese by spinute
- Korean by mingrammer
- Russian by badkaktus
- Ukrainian by butuzov
- Brazilian Portuguese by lcslitx
- Vietnamese by s6k Gopher
- Burmese by Set Kyar Wa Lar
Thanks to Jeremy Ashkenas for Docco, which inspired this project.
We're very happy to fix problem reports and accept contributions! Please submit
an issue or send a Pull Request.
See CONTRIBUTING.md
for more details.
Given Go's strong backwards compatibility guarantees, we expect the vast majority of examples to work on the latest released version of Go as well as many older releases going back years.
That said, some examples show off new features added in recent releases; therefore, it's recommended to try running examples with the latest officially released Go version (see Go's release history for details).
Some of the examples demonstrate concurrent code which has a non-deterministic execution order. It depends on how the Go runtime schedules its goroutines and may vary by operating system, CPU architecture, or even Go version.
Similarly, examples that iterate over maps may produce items in a different order from what you're getting on your machine. This is because the order of iteration over maps in Go is not specified and is not guaranteed to be the same from one iteration to the next.
It doesn't mean anything is wrong with the example. Typically the code in these examples will be insensitive to the actual order of the output; if the code is sensitive to the order - that's probably a bug - so feel free to report it.