[
  {
    "path": ".gitattributes",
    "content": "public/** linguist-generated\n\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: test\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n\n  build:\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest]\n        go-version: [1.26.0]\n\n    runs-on: ${{ matrix.os }}\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Set up Go\n      uses: actions/setup-go@v3\n      with:\n        go-version: ${{ matrix.go-version }}\n\n    - name: Test\n      run: tools/build\n      env:\n        VERBOSE: 1\n        TESTING: 1\n"
  },
  {
    "path": ".gitignore",
    "content": "*.pyc\n.idea\n.vscode\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Contributing\n\nThanks for your interest in contributing to Go by Example!\n\n* When sending a PR that affects the displayed contents of the site, \n  updating the HTML in the `public` directory by itself is insufficient, since\n  the source of truth for the website is in the `examples` directory.\n  \n  Instead, update the proper source file(s) in the `examples` directory and\n  run `tools/build` locally to regenerate the HTML; include both changes in\n  your PR.  \n  \n  If you don't want to deal with getting a proper PR in, feel free to just\n  open an issue and point out the change you suggest.\n\n* We're open to adding more examples to the site. They should be on things\n  used by many programmers and only require the standard library. If you're\n  interested in adding an example, _please open an issue to discuss the topic\n  first_.\n\n* We're not going to change the navigation of the site, in particular adding\n  a \"previous section\" link or an \"index\" link other than the one on the title\n  text.\n"
  },
  {
    "path": "README.md",
    "content": "# Go by Example\n\nContent and build toolchain for [Go by Example](https://gobyexample.com),\na site that teaches Go via annotated example programs.\n\n### Overview\n\nThe Go by Example site is built by extracting code and\ncomments from source files in `examples` and rendering\nthem using `templates` into a static `public`\ndirectory. The programs implementing this build process\nare in `tools`, along with dependencies specified in\nthe `go.mod`file.\n\nThe built `public` directory can be served by any\nstatic content system. The production site uses S3 and\nCloudFront, for example.\n\n### Building\n\n[![test](https://github.com/mmcgrana/gobyexample/actions/workflows/test.yml/badge.svg)](https://github.com/mmcgrana/gobyexample/actions/workflows/test.yml)\n\nTo build the site you'll need Go installed. Run:\n\n```console\n$ tools/build\n```\n\nTo build continuously in a loop:\n\n```console\n$ tools/build-loop\n```\n\nTo see the site locally:\n\n```console\n$ tools/serve\n```\n\nand open `http://127.0.0.1:8000/` in your browser.\n\n### Publishing\n\nTo upload the site:\n\n```console\n$ export AWS_ACCESS_KEY_ID=...\n$ export AWS_SECRET_ACCESS_KEY=...\n$ tools/upload\n```\n\n### License\n\nThis work is copyright Mark McGranaghan and licensed under a\n[Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/).\n\nThe Go Gopher is copyright [Renée French](https://reneefrench.blogspot.com/) and licensed under a\n[Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/).\n\n\n### Translations\n\nContributor translations of the Go by Example site are available in:\n\n* [Chinese](https://gobyexample-cn.github.io/) by [gobyexample-cn](https://github.com/gobyexample-cn)\n* [French](http://le-go-par-l-exemple.keiruaprod.fr) by [keirua](https://github.com/keirua/gobyexample)\n* [Italian](https://gobyexampleit.andrearaponi.it/) by [andrearaponi](https://github.com/andrearaponi/gobyexample-it)\n* [Japanese](http://spinute.org/go-by-example) by [spinute](https://github.com/spinute)\n* [Korean](https://mingrammer.com/gobyexample/) by [mingrammer](https://github.com/mingrammer)\n* [Ukrainian](https://butuzov.github.io/gobyexample/) by [butuzov](https://github.com/butuzov/gobyexample)\n* [Brazilian Portuguese](https://lcslitx.github.io/GoEmExemplos/) by [lcslitx](https://github.com/LCSLITX)\n* [Burmese](https://setkyar.github.io/gobyexample) by [Set Kyar Wa Lar](https://github.com/setkyar/gobyexample)\n\n### Thanks\n\nThanks to [Jeremy Ashkenas](https://github.com/jashkenas)\nfor [Docco](http://jashkenas.github.io/docco/), which\ninspired this project.\n\n### FAQ\n\n#### I found a problem with the examples; what do I do?\n\nWe're very happy to fix problem reports and accept contributions! Please submit\n[an issue](https://github.com/mmcgrana/gobyexample/issues) or send a Pull Request.\nSee `CONTRIBUTING.md` for more details.\n\n#### What version of Go is required to run these examples?\n\nGiven Go's strong [backwards compatibility guarantees](https://go.dev/doc/go1compat),\nwe expect the vast majority of examples to work on the latest released version of Go\nas well as many older releases going back years.\n\nThat said, some examples show off new features added in recent releases; therefore,\nit's recommended to try running examples with the latest officially released Go version\n(see Go's [release history](https://go.dev/doc/devel/release) for details).\n\n#### I'm getting output in a different order from the example. Is the example wrong?\n\nSome of the examples demonstrate concurrent code which has a non-deterministic\nexecution order. It depends on how the Go runtime schedules its goroutines and\nmay vary by operating system, CPU architecture, or even Go version.\n\nSimilarly, examples that iterate over maps may produce items in a different order\nfrom what you're getting on your machine. This is because the order of iteration\nover maps in Go is [not specified and is not guaranteed to be the same from one\niteration to the next](https://go.dev/ref/spec#RangeClause).\n\nIt doesn't mean anything is wrong with the example. Typically the code in these\nexamples will be insensitive to the actual order of the output; if the code is\nsensitive to the order - that's probably a bug - so feel free to report it.\n\n\n\n\n"
  },
  {
    "path": "examples/arrays/arrays.go",
    "content": "// In Go, an _array_ is a numbered sequence of elements of a\n// specific length. In typical Go code, [slices](slices) are\n// much more common; arrays are useful in some special\n// scenarios.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// Here we create an array `a` that will hold exactly\n\t// 5 `int`s. The type of elements and length are both\n\t// part of the array's type. By default an array is\n\t// zero-valued, which for `int`s means `0`s.\n\tvar a [5]int\n\tfmt.Println(\"emp:\", a)\n\n\t// We can set a value at an index using the\n\t// `array[index] = value` syntax, and get a value with\n\t// `array[index]`.\n\ta[4] = 100\n\tfmt.Println(\"set:\", a)\n\tfmt.Println(\"get:\", a[4])\n\n\t// The builtin `len` returns the length of an array.\n\tfmt.Println(\"len:\", len(a))\n\n\t// Use this syntax to declare and initialize an array\n\t// in one line.\n\tb := [5]int{1, 2, 3, 4, 5}\n\tfmt.Println(\"dcl:\", b)\n\n\t// You can also have the compiler count the number of\n\t// elements for you with `...`\n\tb = [...]int{1, 2, 3, 4, 5}\n\tfmt.Println(\"dcl:\", b)\n\n\t// If you specify the index with `:`, the elements in\n\t// between will be zeroed.\n\tb = [...]int{100, 3: 400, 500}\n\tfmt.Println(\"idx:\", b)\n\n\t// Array types are one-dimensional, but you can\n\t// compose types to build multi-dimensional data\n\t// structures.\n\tvar twoD [2][3]int\n\tfor i := range 2 {\n\t\tfor j := range 3 {\n\t\t\ttwoD[i][j] = i + j\n\t\t}\n\t}\n\tfmt.Println(\"2d: \", twoD)\n\n\t// You can create and initialize multi-dimensional\n\t// arrays at once too.\n\ttwoD = [2][3]int{\n\t\t{1, 2, 3},\n\t\t{1, 2, 3},\n\t}\n\tfmt.Println(\"2d: \", twoD)\n}\n"
  },
  {
    "path": "examples/arrays/arrays.hash",
    "content": "96cbe484a18a0dd8c1839a92963447bed94cc997\n-NFSggT7dFH\n"
  },
  {
    "path": "examples/arrays/arrays.sh",
    "content": "# Note that arrays appear in the form `[v1 v2 v3 ...]`\n# when printed with `fmt.Println`.\n$ go run arrays.go\nemp: [0 0 0 0 0]\nset: [0 0 0 0 100]\nget: 100\nlen: 5\ndcl: [1 2 3 4 5]\ndcl: [1 2 3 4 5]\nidx: [100 0 0 400 500]\n2d:  [[0 1 2] [1 2 3]]\n2d:  [[1 2 3] [1 2 3]]\n"
  },
  {
    "path": "examples/atomic-counters/atomic-counters.go",
    "content": "// The primary mechanism for managing state in Go is\n// communication over channels. We saw this for example\n// with [worker pools](worker-pools). There are a few other\n// options for managing state though. Here we'll\n// look at using the `sync/atomic` package for _atomic\n// counters_ accessed by multiple goroutines.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"sync/atomic\"\n)\n\nfunc main() {\n\n\t// We'll use an atomic integer type to represent our\n\t// (always-positive) counter.\n\tvar ops atomic.Uint64\n\n\t// A WaitGroup will help us wait for all goroutines\n\t// to finish their work.\n\tvar wg sync.WaitGroup\n\n\t// We'll start 50 goroutines that each increment the\n\t// counter exactly 1000 times.\n\tfor range 50 {\n\t\twg.Go(func() {\n\t\t\tfor range 1000 {\n\t\t\t\t// To atomically increment the counter we use `Add`.\n\t\t\t\tops.Add(1)\n\t\t\t}\n\t\t})\n\t}\n\n\t// Wait until all the goroutines are done.\n\twg.Wait()\n\n\t// Here no goroutines are writing to 'ops', but using\n\t// `Load` it's safe to atomically read a value even while\n\t// other goroutines are (atomically) updating it.\n\tfmt.Println(\"ops:\", ops.Load())\n}\n"
  },
  {
    "path": "examples/atomic-counters/atomic-counters.hash",
    "content": "d898b7b79368f70c6f6d1c181575f7b83c592718\nyiGAVfTH49v\n"
  },
  {
    "path": "examples/atomic-counters/atomic-counters.sh",
    "content": "# We expect to get exactly 50,000 operations. Had we\n# used a non-atomic integer and incremented it with\n# `ops++`, we'd likely get a different number,\n# changing between runs, because the goroutines\n# would interfere with each other. Moreover, we'd\n# get data race failures when running with the\n# `-race` flag.\n$ go run atomic-counters.go\nops: 50000\n\n# Next we'll look at mutexes, another tool for managing\n# state.\n"
  },
  {
    "path": "examples/base64-encoding/base64-encoding.go",
    "content": "// Go provides built-in support for [base64\n// encoding/decoding](https://en.wikipedia.org/wiki/Base64).\n\npackage main\n\n// This syntax imports the `encoding/base64` package with\n// the `b64` name instead of the default `base64`. It'll\n// save us some space below.\nimport (\n\tb64 \"encoding/base64\"\n\t\"fmt\"\n)\n\nfunc main() {\n\n\t// Here's the `string` we'll encode/decode.\n\tdata := \"abc123!?$*&()'-=@~\"\n\n\t// Go supports both standard and URL-compatible\n\t// base64. Here's how to encode using the standard\n\t// encoder. The encoder requires a `[]byte` so we\n\t// convert our `string` to that type.\n\tsEnc := b64.StdEncoding.EncodeToString([]byte(data))\n\tfmt.Println(sEnc)\n\n\t// Decoding may return an error, which you can check\n\t// if you don't already know the input to be\n\t// well-formed.\n\tsDec, _ := b64.StdEncoding.DecodeString(sEnc)\n\tfmt.Println(string(sDec))\n\tfmt.Println()\n\n\t// This encodes/decodes using a URL-compatible base64\n\t// format.\n\tuEnc := b64.URLEncoding.EncodeToString([]byte(data))\n\tfmt.Println(uEnc)\n\tuDec, _ := b64.URLEncoding.DecodeString(uEnc)\n\tfmt.Println(string(uDec))\n}\n"
  },
  {
    "path": "examples/base64-encoding/base64-encoding.hash",
    "content": "47f0317643bc5107af6fae64cb0fdad1260ead37\nyztzkirFEvv\n"
  },
  {
    "path": "examples/base64-encoding/base64-encoding.sh",
    "content": "# The string encodes to slightly different values with the\n# standard and URL base64 encoders (trailing `+` vs `-`)\n# but they both decode to the original string as desired.\n$ go run base64-encoding.go\nYWJjMTIzIT8kKiYoKSctPUB+\nabc123!?$*&()'-=@~\n\nYWJjMTIzIT8kKiYoKSctPUB-\nabc123!?$*&()'-=@~\n"
  },
  {
    "path": "examples/channel-buffering/channel-buffering.go",
    "content": "// By default channels are _unbuffered_, meaning that they\n// will only accept sends (`chan <-`) if there is a\n// corresponding receive (`<- chan`) ready to receive the\n// sent value. _Buffered channels_ accept a limited\n// number of  values without a corresponding receiver for\n// those values.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// Here we `make` a channel of strings buffering up to\n\t// 2 values.\n\tmessages := make(chan string, 2)\n\n\t// Because this channel is buffered, we can send these\n\t// values into the channel without a corresponding\n\t// concurrent receive.\n\tmessages <- \"buffered\"\n\tmessages <- \"channel\"\n\n\t// Later we can receive these two values as usual.\n\tfmt.Println(<-messages)\n\tfmt.Println(<-messages)\n}\n"
  },
  {
    "path": "examples/channel-buffering/channel-buffering.hash",
    "content": "558f4f1140a52e1804636f5720a10de0b37ebddb\n3BRCdRnRszb\n"
  },
  {
    "path": "examples/channel-buffering/channel-buffering.sh",
    "content": "$ go run channel-buffering.go \nbuffered\nchannel\n"
  },
  {
    "path": "examples/channel-directions/channel-directions.go",
    "content": "// When using channels as function parameters, you can\n// specify if a channel is meant to only send or receive\n// values. This specificity increases the type-safety of\n// the program.\n\npackage main\n\nimport \"fmt\"\n\n// This `ping` function only accepts a channel for sending\n// values. It would be a compile-time error to try to\n// receive on this channel.\nfunc ping(pings chan<- string, msg string) {\n\tpings <- msg\n}\n\n// The `pong` function accepts one channel for receives\n// (`pings`) and a second for sends (`pongs`).\nfunc pong(pings <-chan string, pongs chan<- string) {\n\tmsg := <-pings\n\tpongs <- msg\n}\n\nfunc main() {\n\tpings := make(chan string, 1)\n\tpongs := make(chan string, 1)\n\tping(pings, \"passed message\")\n\tpong(pings, pongs)\n\tfmt.Println(<-pongs)\n}\n"
  },
  {
    "path": "examples/channel-directions/channel-directions.hash",
    "content": "d1b1580f72c3c101ea46480e6c2361f4f96b049a\nmjNJDHwUH4R\n"
  },
  {
    "path": "examples/channel-directions/channel-directions.sh",
    "content": "$ go run channel-directions.go\npassed message\n"
  },
  {
    "path": "examples/channel-synchronization/channel-synchronization.go",
    "content": "// We can use channels to synchronize execution\n// across goroutines. Here's an example of using a\n// blocking receive to wait for a goroutine to finish.\n// When waiting for multiple goroutines to finish,\n// you may prefer to use a [WaitGroup](waitgroups).\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// This is the function we'll run in a goroutine. The\n// `done` channel will be used to notify another\n// goroutine that this function's work is done.\nfunc worker(done chan bool) {\n\tfmt.Print(\"working...\")\n\ttime.Sleep(time.Second)\n\tfmt.Println(\"done\")\n\n\t// Send a value to notify that we're done.\n\tdone <- true\n}\n\nfunc main() {\n\n\t// Start a worker goroutine, giving it the channel to\n\t// notify on.\n\tdone := make(chan bool, 1)\n\tgo worker(done)\n\n\t// Block until we receive a notification from the\n\t// worker on the channel.\n\t<-done\n}\n"
  },
  {
    "path": "examples/channel-synchronization/channel-synchronization.hash",
    "content": "aa83d53fdee417727ec9a7cd90172d34c15a28c2\nNw-1DzIGk5f\n"
  },
  {
    "path": "examples/channel-synchronization/channel-synchronization.sh",
    "content": "$ go run channel-synchronization.go      \nworking...done                  \n\n# If you removed the `<- done` line from this program,\n# the program could exit before the `worker` finished\n# its work, or in some cases even before it started.\n"
  },
  {
    "path": "examples/channels/channels.go",
    "content": "// _Channels_ are the pipes that connect concurrent\n// goroutines. You can send values into channels from one\n// goroutine and receive those values into another\n// goroutine.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// Create a new channel with `make(chan val-type)`.\n\t// Channels are typed by the values they convey.\n\tmessages := make(chan string)\n\n\t// _Send_ a value into a channel using the `channel <-`\n\t// syntax. Here we send `\"ping\"`  to the `messages`\n\t// channel we made above, from a new goroutine.\n\tgo func() { messages <- \"ping\" }()\n\n\t// The `<-channel` syntax _receives_ a value from the\n\t// channel. Here we'll receive the `\"ping\"` message\n\t// we sent above and print it out.\n\tmsg := <-messages\n\tfmt.Println(msg)\n}\n"
  },
  {
    "path": "examples/channels/channels.hash",
    "content": "4fa3a8956f7f1ded57e8dc72827329aef8497e18\nMaLY7AiAkHM\n"
  },
  {
    "path": "examples/channels/channels.sh",
    "content": "# When we run the program the `\"ping\"` message is\n# successfully passed from one goroutine to another via\n# our channel.\n$ go run channels.go \nping\n\n# By default sends and receives block until both the\n# sender and receiver are ready. This property allowed\n# us to wait at the end of our program for the `\"ping\"`\n# message without having to use any other synchronization.\n"
  },
  {
    "path": "examples/closing-channels/closing-channels.go",
    "content": "// _Closing_ a channel indicates that no more values\n// will be sent on it. This can be useful to communicate\n// completion to the channel's receivers.\n\npackage main\n\nimport \"fmt\"\n\n// In this example we'll use a `jobs` channel to\n// communicate work to be done from the `main()` goroutine\n// to a worker goroutine. When we have no more jobs for\n// the worker we'll `close` the `jobs` channel.\nfunc main() {\n\tjobs := make(chan int, 5)\n\tdone := make(chan bool)\n\n\t// Here's the worker goroutine. It repeatedly receives\n\t// from `jobs` with `j, more := <-jobs`. In this\n\t// special 2-value form of receive, the `more` value\n\t// will be `false` if `jobs` has been `close`d and all\n\t// values in the channel have already been received.\n\t// We use this to notify on `done` when we've worked\n\t// all our jobs.\n\tgo func() {\n\t\tfor {\n\t\t\tj, more := <-jobs\n\t\t\tif more {\n\t\t\t\tfmt.Println(\"received job\", j)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"received all jobs\")\n\t\t\t\tdone <- true\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\t// This sends 3 jobs to the worker over the `jobs`\n\t// channel, then closes it.\n\tfor j := 1; j <= 3; j++ {\n\t\tjobs <- j\n\t\tfmt.Println(\"sent job\", j)\n\t}\n\tclose(jobs)\n\tfmt.Println(\"sent all jobs\")\n\n\t// We await the worker using the\n\t// [synchronization](channel-synchronization) approach\n\t// we saw earlier.\n\t<-done\n\n\t// Reading from a closed channel succeeds immediately,\n\t// returning the zero value of the underlying type.\n\t// The optional second return value is `true` if the\n\t// value received was delivered by a successful send\n\t// operation to the channel, or `false` if it was a\n\t// zero value generated because the channel is closed\n\t// and empty.\n\t_, ok := <-jobs\n\tfmt.Println(\"received more jobs:\", ok)\n}\n"
  },
  {
    "path": "examples/closing-channels/closing-channels.hash",
    "content": "13f0ccf3674db8e9631a424c4070f9d423f7dc11\nyZijZHYe22y\n"
  },
  {
    "path": "examples/closing-channels/closing-channels.sh",
    "content": "$ go run closing-channels.go \nsent job 1\nreceived job 1\nsent job 2\nreceived job 2\nsent job 3\nreceived job 3\nsent all jobs\nreceived all jobs\nreceived more jobs: false\n\n# The idea of closed channels leads naturally to our next\n# example: `range` over channels.\n"
  },
  {
    "path": "examples/closures/closures.go",
    "content": "// Go supports [_anonymous functions_](https://en.wikipedia.org/wiki/Anonymous_function),\n// which can form <a href=\"https://en.wikipedia.org/wiki/Closure_(computer_science)\"><em>closures</em></a>.\n// Anonymous functions are useful when you want to define\n// a function inline without having to name it.\n\npackage main\n\nimport \"fmt\"\n\n// This function `intSeq` returns another function, which\n// we define anonymously in the body of `intSeq`. The\n// returned function _closes over_ the variable `i` to\n// form a closure.\nfunc intSeq() func() int {\n\ti := 0\n\treturn func() int {\n\t\ti++\n\t\treturn i\n\t}\n}\n\nfunc main() {\n\n\t// We call `intSeq`, assigning the result (a function)\n\t// to `nextInt`. This function value captures its\n\t// own `i` value, which will be updated each time\n\t// we call `nextInt`.\n\tnextInt := intSeq()\n\n\t// See the effect of the closure by calling `nextInt`\n\t// a few times.\n\tfmt.Println(nextInt())\n\tfmt.Println(nextInt())\n\tfmt.Println(nextInt())\n\n\t// To confirm that the state is unique to that\n\t// particular function, create and test a new one.\n\tnewInts := intSeq()\n\tfmt.Println(newInts())\n}\n"
  },
  {
    "path": "examples/closures/closures.hash",
    "content": "6514e124c8127250a2eecfadc9708181e51f9603\nNpgpzS8ZG8y\n"
  },
  {
    "path": "examples/closures/closures.sh",
    "content": "$ go run closures.go\n1\n2\n3\n1\n\n# The last feature of functions we'll look at for now is\n# recursion.\n"
  },
  {
    "path": "examples/command-line-arguments/command-line-arguments.go",
    "content": "// [_Command-line arguments_](https://en.wikipedia.org/wiki/Command-line_interface#Arguments)\n// are a common way to parameterize execution of programs.\n// For example, `go run hello.go` uses `run` and\n// `hello.go` arguments to the `go` program.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\n\t// `os.Args` provides access to raw command-line\n\t// arguments. Note that the first value in this slice\n\t// is the path to the program, and `os.Args[1:]`\n\t// holds the arguments to the program.\n\targsWithProg := os.Args\n\targsWithoutProg := os.Args[1:]\n\n\t// You can get individual args with normal indexing.\n\targ := os.Args[3]\n\n\tfmt.Println(argsWithProg)\n\tfmt.Println(argsWithoutProg)\n\tfmt.Println(arg)\n}\n"
  },
  {
    "path": "examples/command-line-arguments/command-line-arguments.hash",
    "content": "ad871e829d1457d97d0f1c1af77e39f6942ac5a5\nUYCEvh9d2Zb\n"
  },
  {
    "path": "examples/command-line-arguments/command-line-arguments.sh",
    "content": "# To experiment with command-line arguments it's best to\n# build a binary with `go build` first.\n$ go build command-line-arguments.go\n$ ./command-line-arguments a b c d\n[./command-line-arguments a b c d]       \n[a b c d]\nc\n\n# Next we'll look at more advanced command-line processing\n# with flags.\n"
  },
  {
    "path": "examples/command-line-flags/command-line-flags.go",
    "content": "// [_Command-line flags_](https://en.wikipedia.org/wiki/Command-line_interface#Command-line_option)\n// are a common way to specify options for command-line\n// programs. For example, in `wc -l` the `-l` is a\n// command-line flag.\n\npackage main\n\n// Go provides a `flag` package supporting basic\n// command-line flag parsing. We'll use this package to\n// implement our example command-line program.\nimport (\n\t\"flag\"\n\t\"fmt\"\n)\n\nfunc main() {\n\n\t// Basic flag declarations are available for string,\n\t// integer, and boolean options. Here we declare a\n\t// string flag `word` with a default value `\"foo\"`\n\t// and a short description. This `flag.String` function\n\t// returns a string pointer (not a string value);\n\t// we'll see how to use this pointer below.\n\twordPtr := flag.String(\"word\", \"foo\", \"a string\")\n\n\t// This declares `numb` and `fork` flags, using a\n\t// similar approach to the `word` flag.\n\tnumbPtr := flag.Int(\"numb\", 42, \"an int\")\n\tforkPtr := flag.Bool(\"fork\", false, \"a bool\")\n\n\t// It's also possible to declare an option that uses an\n\t// existing var declared elsewhere in the program.\n\t// Note that we need to pass in a pointer to the flag\n\t// declaration function.\n\tvar svar string\n\tflag.StringVar(&svar, \"svar\", \"bar\", \"a string var\")\n\n\t// Once all flags are declared, call `flag.Parse()`\n\t// to execute the command-line parsing.\n\tflag.Parse()\n\n\t// Here we'll just dump out the parsed options and\n\t// any trailing positional arguments. Note that we\n\t// need to dereference the pointers with e.g. `*wordPtr`\n\t// to get the actual option values.\n\tfmt.Println(\"word:\", *wordPtr)\n\tfmt.Println(\"numb:\", *numbPtr)\n\tfmt.Println(\"fork:\", *forkPtr)\n\tfmt.Println(\"svar:\", svar)\n\tfmt.Println(\"tail:\", flag.Args())\n}\n"
  },
  {
    "path": "examples/command-line-flags/command-line-flags.hash",
    "content": "9cca50e58f488570cc8e92dde37582ea5ee04bf3\nIUPZlYSigc3\n"
  },
  {
    "path": "examples/command-line-flags/command-line-flags.sh",
    "content": "# To experiment with the command-line flags program it's\n# best to first compile it and then run the resulting\n# binary directly.\n$ go build command-line-flags.go\n\n# Try out the built program by first giving it values for\n# all flags.\n$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag\nword: opt\nnumb: 7\nfork: true\nsvar: flag\ntail: []\n\n# Note that if you omit flags they automatically take\n# their default values.\n$ ./command-line-flags -word=opt\nword: opt\nnumb: 42\nfork: false\nsvar: bar\ntail: []\n\n# Trailing positional arguments can be provided after\n# any flags.\n$ ./command-line-flags -word=opt a1 a2 a3\nword: opt\n...\ntail: [a1 a2 a3]\n\n# Note that the `flag` package requires all flags to\n# appear before positional arguments (otherwise the flags\n# will be interpreted as positional arguments).\n$ ./command-line-flags -word=opt a1 a2 a3 -numb=7\nword: opt\nnumb: 42\nfork: false\nsvar: bar\ntail: [a1 a2 a3 -numb=7]\n\n# Use `-h` or `--help` flags to get automatically\n# generated help text for the command-line program.\n$ ./command-line-flags -h\nUsage of ./command-line-flags:\n  -fork=false: a bool\n  -numb=42: an int\n  -svar=\"bar\": a string var\n  -word=\"foo\": a string\n\n# If you provide a flag that wasn't specified to the\n# `flag` package, the program will print an error message\n# and show the help text again.\n$ ./command-line-flags -wat\nflag provided but not defined: -wat\nUsage of ./command-line-flags:\n...\n"
  },
  {
    "path": "examples/command-line-subcommands/command-line-subcommands.go",
    "content": "// Some command-line tools, like the `go` tool or `git`\n// have many *subcommands*, each with its own set of\n// flags. For example, `go build` and `go get` are two\n// different subcommands of the `go` tool.\n// The `flag` package lets us easily define simple\n// subcommands that have their own flags.\n\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\n\t// We declare a subcommand using the `NewFlagSet`\n\t// function, and proceed to define new flags specific\n\t// for this subcommand.\n\tfooCmd := flag.NewFlagSet(\"foo\", flag.ExitOnError)\n\tfooEnable := fooCmd.Bool(\"enable\", false, \"enable\")\n\tfooName := fooCmd.String(\"name\", \"\", \"name\")\n\n\t// For a different subcommand we can define different\n\t// supported flags.\n\tbarCmd := flag.NewFlagSet(\"bar\", flag.ExitOnError)\n\tbarLevel := barCmd.Int(\"level\", 0, \"level\")\n\n\t// The subcommand is expected as the first argument\n\t// to the program.\n\tif len(os.Args) < 2 {\n\t\tfmt.Println(\"expected 'foo' or 'bar' subcommands\")\n\t\tos.Exit(1)\n\t}\n\n\t// Check which subcommand is invoked.\n\tswitch os.Args[1] {\n\n\t// For every subcommand, we parse its own flags and\n\t// have access to trailing positional arguments.\n\tcase \"foo\":\n\t\tfooCmd.Parse(os.Args[2:])\n\t\tfmt.Println(\"subcommand 'foo'\")\n\t\tfmt.Println(\"  enable:\", *fooEnable)\n\t\tfmt.Println(\"  name:\", *fooName)\n\t\tfmt.Println(\"  tail:\", fooCmd.Args())\n\tcase \"bar\":\n\t\tbarCmd.Parse(os.Args[2:])\n\t\tfmt.Println(\"subcommand 'bar'\")\n\t\tfmt.Println(\"  level:\", *barLevel)\n\t\tfmt.Println(\"  tail:\", barCmd.Args())\n\tdefault:\n\t\tfmt.Println(\"expected 'foo' or 'bar' subcommands\")\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "examples/command-line-subcommands/command-line-subcommands.hash",
    "content": "eed015f91ba8a8d5a667dfc4dde745e341fded6e\nDkvdHKK-XCv\n"
  },
  {
    "path": "examples/command-line-subcommands/command-line-subcommands.sh",
    "content": "$ go build command-line-subcommands.go \n\n# First invoke the foo subcommand.\n$ ./command-line-subcommands foo -enable -name=joe a1 a2\nsubcommand 'foo'\n  enable: true\n  name: joe\n  tail: [a1 a2]\n\n# Now try bar.\n$ ./command-line-subcommands bar -level 8 a1\nsubcommand 'bar'\n  level: 8\n  tail: [a1]\n\n# But bar won't accept foo's flags.\n$ ./command-line-subcommands bar -enable a1\nflag provided but not defined: -enable\nUsage of bar:\n  -level int\n    \tlevel\n\n# Next we'll look at environment variables, another common\n# way to parameterize programs.\n"
  },
  {
    "path": "examples/constants/constants.go",
    "content": "// Go supports _constants_ of character, string, boolean,\n// and numeric values.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\n// `const` declares a constant value.\nconst s string = \"constant\"\n\nfunc main() {\n\tfmt.Println(s)\n\n\t// A `const` statement can also appear inside a\n\t// function body.\n\tconst n = 500000000\n\n\t// Constant expressions perform arithmetic with\n\t// arbitrary precision.\n\tconst d = 3e20 / n\n\tfmt.Println(d)\n\n\t// A numeric constant has no type until it's given\n\t// one, such as by an explicit conversion.\n\tfmt.Println(int64(d))\n\n\t// A number can be given a type by using it in a\n\t// context that requires one, such as a variable\n\t// assignment or function call. For example, here\n\t// `math.Sin` expects a `float64`.\n\tfmt.Println(math.Sin(n))\n}\n"
  },
  {
    "path": "examples/constants/constants.hash",
    "content": "96fb6ba58e0860f9f6ed3f26db2f1cbdd9a0dbd6\nLfvIxHlpomp\n"
  },
  {
    "path": "examples/constants/constants.sh",
    "content": "$ go run constant.go \nconstant\n6e+11\n600000000000\n-0.28470407323754404\n"
  },
  {
    "path": "examples/context/context.go",
    "content": "// In the previous example we looked at setting up a simple\n// [HTTP server](http-server). HTTP servers are useful for\n// demonstrating the usage of `context.Context` for\n// controlling cancellation. A `Context` carries deadlines,\n// cancellation signals, and other request-scoped values\n// across API boundaries and goroutines.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n)\n\nfunc hello(w http.ResponseWriter, req *http.Request) {\n\n\t// A `context.Context` is created for each request by\n\t// the `net/http` machinery, and is available with\n\t// the `Context()` method.\n\tctx := req.Context()\n\tfmt.Println(\"server: hello handler started\")\n\tdefer fmt.Println(\"server: hello handler ended\")\n\n\t// Wait for a few seconds before sending a reply to the\n\t// client. This could simulate some work the server is\n\t// doing. While working, keep an eye on the context's\n\t// `Done()` channel for a signal that we should cancel\n\t// the work and return as soon as possible.\n\tselect {\n\tcase <-time.After(10 * time.Second):\n\t\tfmt.Fprintf(w, \"hello\\n\")\n\tcase <-ctx.Done():\n\t\t// The context's `Err()` method returns an error\n\t\t// that explains why the `Done()` channel was\n\t\t// closed.\n\t\terr := ctx.Err()\n\t\tfmt.Println(\"server:\", err)\n\t\tinternalError := http.StatusInternalServerError\n\t\thttp.Error(w, err.Error(), internalError)\n\t}\n}\n\nfunc main() {\n\n\t// As before, we register our handler on the \"/hello\"\n\t// route, and start serving.\n\thttp.HandleFunc(\"/hello\", hello)\n\thttp.ListenAndServe(\":8090\", nil)\n}\n"
  },
  {
    "path": "examples/context/context.hash",
    "content": "94a35a6172346b56737ed907a2320bd30f98995d\n7G1TlQrnbF1\n"
  },
  {
    "path": "examples/context/context.sh",
    "content": "# Run the server in the background.\n$ go run context.go &\n\n# Simulate a client request to `/hello`, hitting\n# Ctrl+C shortly after starting to signal\n# cancellation.\n$ curl localhost:8090/hello\nserver: hello handler started\n^C\nserver: context canceled\nserver: hello handler ended\n"
  },
  {
    "path": "examples/custom-errors/custom-errors.go",
    "content": "// It's possible to define custom error types by\n// implementing the `Error()` method on them. Here's a\n// variant on the example above that uses a custom type\n// to explicitly represent an argument error.\n\npackage main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// A custom error type usually has the suffix \"Error\".\ntype argError struct {\n\targ     int\n\tmessage string\n}\n\n// Adding this `Error` method makes `argError` implement\n// the `error` interface.\nfunc (e *argError) Error() string {\n\treturn fmt.Sprintf(\"%d - %s\", e.arg, e.message)\n}\n\nfunc f(arg int) (int, error) {\n\tif arg == 42 {\n\n\t\t// Return our custom error.\n\t\treturn -1, &argError{arg, \"can't work with it\"}\n\t}\n\treturn arg + 3, nil\n}\n\nfunc main() {\n\n\t// `errors.AsType` is a more advanced version of `errors.Is`.\n\t// It checks that a given error (or any error in its chain)\n\t// matches a specific error type and converts to a value\n\t// of that type, also returning `true`. If there's no match, the\n\t// second return value is `false`.\n\t_, err := f(42)\n\tif ae, ok := errors.AsType[*argError](err); ok {\n\t\tfmt.Println(ae.arg)\n\t\tfmt.Println(ae.message)\n\t} else {\n\t\tfmt.Println(\"err doesn't match argError\")\n\t}\n}\n"
  },
  {
    "path": "examples/custom-errors/custom-errors.hash",
    "content": "fe71c150846bfa4d8dddfda4903fa8e30077a5b2\n0WHh8JFOjQq\n"
  },
  {
    "path": "examples/custom-errors/custom-errors.sh",
    "content": "$ go run custom-errors.go\n42\ncan't work with it\n"
  },
  {
    "path": "examples/defer/defer.go",
    "content": "// _Defer_ is used to ensure that a function call is\n// performed later in a program's execution, usually for\n// purposes of cleanup. `defer` is often used where e.g.\n// `ensure` and `finally` would be used in other languages.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// Suppose we wanted to create a file, write to it,\n// and then close when we're done. Here's how we could\n// do that with `defer`.\nfunc main() {\n\n\t// Immediately after getting a file object with\n\t// `createFile`, we defer the closing of that file\n\t// with `closeFile`. This will be executed at the end\n\t// of the enclosing function (`main`), after\n\t// `writeFile` has finished.\n\tpath := filepath.Join(os.TempDir(), \"defer.txt\")\n\tf := createFile(path)\n\tdefer closeFile(f)\n\twriteFile(f)\n}\n\nfunc createFile(p string) *os.File {\n\tfmt.Println(\"creating\")\n\tf, err := os.Create(p)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn f\n}\n\nfunc writeFile(f *os.File) {\n\tfmt.Println(\"writing\")\n\tfmt.Fprintln(f, \"data\")\n}\n\nfunc closeFile(f *os.File) {\n\tfmt.Println(\"closing\")\n\terr := f.Close()\n\t// It's important to check for errors when closing a\n\t// file, even in a deferred function.\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/defer/defer.hash",
    "content": "b3687ac676cbe21ebb53a8d864fc15649c27c4a8\n9_sJ5XnikSw\n"
  },
  {
    "path": "examples/defer/defer.sh",
    "content": "# Running the program confirms that the file is closed\n# after being written.\n$ go run defer.go\ncreating\nwriting\nclosing\n"
  },
  {
    "path": "examples/directories/directories.go",
    "content": "// Go has several useful functions for working with\n// *directories* in the file system.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc check(e error) {\n\tif e != nil {\n\t\tpanic(e)\n\t}\n}\n\nfunc main() {\n\n\t// Create a new sub-directory in the current working\n\t// directory.\n\terr := os.Mkdir(\"subdir\", 0755)\n\tcheck(err)\n\n\t// When creating temporary directories, it's good\n\t// practice to `defer` their removal. `os.RemoveAll`\n\t// will delete a whole directory tree (similarly to\n\t// `rm -rf`).\n\tdefer os.RemoveAll(\"subdir\")\n\n\t// Helper function to create a new empty file.\n\tcreateEmptyFile := func(name string) {\n\t\td := []byte(\"\")\n\t\tcheck(os.WriteFile(name, d, 0644))\n\t}\n\n\tcreateEmptyFile(\"subdir/file1\")\n\n\t// We can create a hierarchy of directories, including\n\t// parents with `MkdirAll`. This is similar to the\n\t// command-line `mkdir -p`.\n\terr = os.MkdirAll(\"subdir/parent/child\", 0755)\n\tcheck(err)\n\n\tcreateEmptyFile(\"subdir/parent/file2\")\n\tcreateEmptyFile(\"subdir/parent/file3\")\n\tcreateEmptyFile(\"subdir/parent/child/file4\")\n\n\t// `ReadDir` lists directory contents, returning a\n\t// slice of `os.DirEntry` objects.\n\tc, err := os.ReadDir(\"subdir/parent\")\n\tcheck(err)\n\n\tfmt.Println(\"Listing subdir/parent\")\n\tfor _, entry := range c {\n\t\tfmt.Println(\" \", entry.Name(), entry.IsDir())\n\t}\n\n\t// `Chdir` lets us change the current working directory,\n\t// similarly to `cd`.\n\terr = os.Chdir(\"subdir/parent/child\")\n\tcheck(err)\n\n\t// Now we'll see the contents of `subdir/parent/child`\n\t// when listing the *current* directory.\n\tc, err = os.ReadDir(\".\")\n\tcheck(err)\n\n\tfmt.Println(\"Listing subdir/parent/child\")\n\tfor _, entry := range c {\n\t\tfmt.Println(\" \", entry.Name(), entry.IsDir())\n\t}\n\n\t// `cd` back to where we started.\n\terr = os.Chdir(\"../../..\")\n\tcheck(err)\n\n\t// We can also visit a directory *recursively*,\n\t// including all its sub-directories. `WalkDir` accepts\n\t// a callback function to handle every file or\n\t// directory visited.\n\tfmt.Println(\"Visiting subdir\")\n\terr = filepath.WalkDir(\"subdir\", visit)\n}\n\n// `visit` is called for every file or directory found\n// recursively by `filepath.WalkDir`.\nfunc visit(path string, d fs.DirEntry, err error) error {\n\tif err != nil {\n\t\treturn err\n\t}\n\tfmt.Println(\" \", path, d.IsDir())\n\treturn nil\n}\n"
  },
  {
    "path": "examples/directories/directories.hash",
    "content": "21e35905e45d7b391823ea761d69199e3712d92c\nORNj2BPrLQr\n"
  },
  {
    "path": "examples/directories/directories.sh",
    "content": "$ go run directories.go\nListing subdir/parent\n  child true\n  file2 false\n  file3 false\nListing subdir/parent/child\n  file4 false\nVisiting subdir\n  subdir true\n  subdir/file1 false\n  subdir/parent true\n  subdir/parent/child true\n  subdir/parent/child/file4 false\n  subdir/parent/file2 false\n  subdir/parent/file3 false\n"
  },
  {
    "path": "examples/embed-directive/embed-directive.go",
    "content": "// `//go:embed` is a [compiler\n// directive](https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives) that\n// allows programs to include arbitrary files and folders in the Go binary at\n// build time. Read more about the embed directive\n// [here](https://pkg.go.dev/embed).\npackage main\n\n// Import the `embed` package; if you don't use any exported\n// identifiers from this package, you can do a blank import with `_ \"embed\"`.\nimport (\n\t\"embed\"\n)\n\n// `embed` directives accept paths relative to the directory containing the\n// Go source file. This directive embeds the contents of the file into the\n// `string` variable immediately following it.\n//\n//go:embed folder/single_file.txt\nvar fileString string\n\n// Or embed the contents of the file into a `[]byte`.\n//\n//go:embed folder/single_file.txt\nvar fileByte []byte\n\n// We can also embed multiple files or even folders with wildcards. This uses\n// a variable of the [embed.FS type](https://pkg.go.dev/embed#FS), which\n// implements a simple virtual file system.\n//\n//go:embed folder/single_file.txt\n//go:embed folder/*.hash\nvar folder embed.FS\n\nfunc main() {\n\n\t// Print out the contents of `single_file.txt`.\n\tprint(fileString)\n\tprint(string(fileByte))\n\n\t// Retrieve some files from the embedded folder.\n\tcontent1, _ := folder.ReadFile(\"folder/file1.hash\")\n\tprint(string(content1))\n\n\tcontent2, _ := folder.ReadFile(\"folder/file2.hash\")\n\tprint(string(content2))\n}\n"
  },
  {
    "path": "examples/embed-directive/embed-directive.hash",
    "content": "69526bd78ac861c85bb12b96e9f1273e8aecc5a6\n6m2ll-D52BB\n"
  },
  {
    "path": "examples/embed-directive/embed-directive.sh",
    "content": "# Use these commands to run the example.\n# (Note: due to limitation on go playground,\n# this example can only be run on your local machine.)\n$ mkdir -p folder\n$ echo \"hello go\" > folder/single_file.txt\n$ echo \"123\" > folder/file1.hash\n$ echo \"456\" > folder/file2.hash\n\n$ go run embed-directive.go\nhello go\nhello go\n123\n456\n\n"
  },
  {
    "path": "examples/embed-directive/folder/file1.hash",
    "content": "123\n"
  },
  {
    "path": "examples/embed-directive/folder/file2.hash",
    "content": "456\n"
  },
  {
    "path": "examples/embed-directive/folder/single_file.txt",
    "content": "hello go\n"
  },
  {
    "path": "examples/enums/enums.go",
    "content": "// _Enumerated types_ (enums) are a special case of\n// [sum types](https://en.wikipedia.org/wiki/Algebraic_data_type).\n// An enum is a type that has a fixed number of possible\n// values, each with a distinct name. Go doesn't have an\n// enum type as a distinct language feature, but enums\n// are simple to implement using existing language idioms.\n\npackage main\n\nimport \"fmt\"\n\n// Our enum type `ServerState` has an underlying `int` type.\ntype ServerState int\n\n// The possible values for `ServerState` are defined as\n// constants. The special keyword [iota](https://go.dev/ref/spec#Iota)\n// generates successive constant values automatically; in this\n// case 0, 1, 2 and so on.\nconst (\n\tStateIdle ServerState = iota\n\tStateConnected\n\tStateError\n\tStateRetrying\n)\n\n// By implementing the [fmt.Stringer](https://pkg.go.dev/fmt#Stringer)\n// interface, values of `ServerState` can be printed out or converted\n// to strings.\n//\n// This can get cumbersome if there are many possible values. In such\n// cases the [stringer tool](https://pkg.go.dev/golang.org/x/tools/cmd/stringer)\n// can be used in conjunction with `go:generate` to automate the\n// process. See [this post](https://eli.thegreenplace.net/2021/a-comprehensive-guide-to-go-generate)\n// for a longer explanation.\nvar stateName = map[ServerState]string{\n\tStateIdle:      \"idle\",\n\tStateConnected: \"connected\",\n\tStateError:     \"error\",\n\tStateRetrying:  \"retrying\",\n}\n\nfunc (ss ServerState) String() string {\n\treturn stateName[ss]\n}\n\nfunc main() {\n\tns := transition(StateIdle)\n\tfmt.Println(ns)\n\t// If we have a value of type `int`, we cannot pass it to `transition` - the\n\t// compiler will complain about type mismatch. This provides some degree of\n\t// compile-time type safety for enums.\n\n\tns2 := transition(ns)\n\tfmt.Println(ns2)\n}\n\n// transition emulates a state transition for a\n// server; it takes the existing state and returns\n// a new state.\nfunc transition(s ServerState) ServerState {\n\tswitch s {\n\tcase StateIdle:\n\t\treturn StateConnected\n\tcase StateConnected, StateRetrying:\n\t\t// Suppose we check some predicates here to\n\t\t// determine the next state...\n\t\treturn StateIdle\n\tcase StateError:\n\t\treturn StateError\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unknown state: %s\", s))\n\t}\n}\n"
  },
  {
    "path": "examples/enums/enums.hash",
    "content": "ee42927ee1c864794570e23e8dadb2d20d64a4fd\nprQMptP_p1s\n"
  },
  {
    "path": "examples/enums/enums.sh",
    "content": "$ go run enums.go\nconnected\nidle\n"
  },
  {
    "path": "examples/environment-variables/environment-variables.go",
    "content": "// [Environment variables](https://en.wikipedia.org/wiki/Environment_variable)\n// are a universal mechanism for [conveying configuration\n// information to Unix programs](https://www.12factor.net/config).\n// Let's look at how to set, get, and list environment variables.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc main() {\n\n\t// To set a key/value pair, use `os.Setenv`. To get a\n\t// value for a key, use `os.Getenv`. This will return\n\t// an empty string if the key isn't present in the\n\t// environment.\n\tos.Setenv(\"FOO\", \"1\")\n\tfmt.Println(\"FOO:\", os.Getenv(\"FOO\"))\n\tfmt.Println(\"BAR:\", os.Getenv(\"BAR\"))\n\n\t// Use `os.Environ` to list all key/value pairs in the\n\t// environment. This returns a slice of strings in the\n\t// form `KEY=value`. You can `strings.SplitN` them to\n\t// get the key and value. Here we print all the keys.\n\tfmt.Println()\n\tfor _, e := range os.Environ() {\n\t\tpair := strings.SplitN(e, \"=\", 2)\n\t\tfmt.Println(pair[0])\n\t}\n}\n"
  },
  {
    "path": "examples/environment-variables/environment-variables.hash",
    "content": "f480d3803659977183a4bc5c14da26c80b1d31fe\n2jmwXM264NC\n"
  },
  {
    "path": "examples/environment-variables/environment-variables.sh",
    "content": "# Running the program shows that we pick up the value\n# for `FOO` that we set in the program, but that\n# `BAR` is empty.\n$ go run environment-variables.go\nFOO: 1\nBAR: \n\n# The list of keys in the environment will depend on your\n# particular machine.\nTERM_PROGRAM\nPATH\nSHELL\n...\nFOO\n\n# If we set `BAR` in the environment first, the running\n# program picks that value up.\n$ BAR=2 go run environment-variables.go\nFOO: 1\nBAR: 2\n...\n"
  },
  {
    "path": "examples/epoch/epoch.go",
    "content": "// A common requirement in programs is getting the number\n// of seconds, milliseconds, or nanoseconds since the\n// [Unix epoch](https://en.wikipedia.org/wiki/Unix_time).\n// Here's how to do it in Go.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// Use `time.Now` with `Unix`, `UnixMilli` or `UnixNano`\n\t// to get elapsed time since the Unix epoch in seconds,\n\t// milliseconds or nanoseconds, respectively.\n\tnow := time.Now()\n\tfmt.Println(now)\n\n\tfmt.Println(now.Unix())\n\tfmt.Println(now.UnixMilli())\n\tfmt.Println(now.UnixNano())\n\n\t// You can also convert integer seconds or nanoseconds\n\t// since the epoch into the corresponding `time`.\n\tfmt.Println(time.Unix(now.Unix(), 0))\n\tfmt.Println(time.Unix(0, now.UnixNano()))\n}\n"
  },
  {
    "path": "examples/epoch/epoch.hash",
    "content": "a67ae165a1f00c205a344327d9d638f4eb931b5c\nlRmD1EWHHPz\n"
  },
  {
    "path": "examples/epoch/epoch.sh",
    "content": "$ go run epoch.go \n2012-10-31 16:13:58.292387 +0000 UTC\n1351700038\n1351700038292\n1351700038292387000\n2012-10-31 16:13:58 +0000 UTC\n2012-10-31 16:13:58.292387 +0000 UTC\n\n# Next we'll look at another time-related task: time\n# parsing and formatting.\n"
  },
  {
    "path": "examples/errors/errors.go",
    "content": "// In Go it's idiomatic to communicate errors via an\n// explicit, separate return value. This contrasts with\n// the exceptions used in languages like Java, Python and\n// Ruby and the overloaded single result / error value\n// sometimes used in C. Go's approach makes it easy to\n// see which functions return errors and to handle them\n// using the same language constructs employed for other,\n// non-error tasks.\n//\n// See the documentation of the [errors package](https://pkg.go.dev/errors)\n// and [this blog post](https://go.dev/blog/go1.13-errors) for additional\n// details.\n\npackage main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// By convention, errors are the last return value and\n// have type `error`, a built-in interface.\nfunc f(arg int) (int, error) {\n\tif arg == 42 {\n\t\t// `errors.New` constructs a basic `error` value\n\t\t// with the given error message.\n\t\treturn -1, errors.New(\"can't work with 42\")\n\t}\n\n\t// A `nil` value in the error position indicates that\n\t// there was no error.\n\treturn arg + 3, nil\n}\n\n// A sentinel error is a predeclared variable that is used to\n// signify a specific error condition.\nvar ErrOutOfTea = errors.New(\"no more tea available\")\nvar ErrPower = errors.New(\"can't boil water\")\n\nfunc makeTea(arg int) error {\n\tif arg == 2 {\n\t\treturn ErrOutOfTea\n\t} else if arg == 4 {\n\n\t\t// We can wrap errors with higher-level errors to add\n\t\t// context. The simplest way to do this is with the\n\t\t// `%w` verb in `fmt.Errorf`. Wrapped errors\n\t\t// create a logical chain (A wraps B, which wraps C, etc.)\n\t\t// that can be queried with functions like `errors.Is`\n\t\t// and `errors.AsType`.\n\t\treturn fmt.Errorf(\"making tea: %w\", ErrPower)\n\t}\n\treturn nil\n}\n\nfunc main() {\n\tfor _, i := range []int{7, 42} {\n\n\t\t// It's idiomatic to use an inline error check in the `if`\n\t\t// line.\n\t\tif r, e := f(i); e != nil {\n\t\t\tfmt.Println(\"f failed:\", e)\n\t\t} else {\n\t\t\tfmt.Println(\"f worked:\", r)\n\t\t}\n\t}\n\n\tfor i := range 5 {\n\t\tif err := makeTea(i); err != nil {\n\n\t\t\t// `errors.Is` checks that a given error (or any error in its chain)\n\t\t\t// matches a specific error value. This is especially useful with wrapped or\n\t\t\t// nested errors, allowing you to identify specific error types or sentinel\n\t\t\t// errors in a chain of errors.\n\t\t\tif errors.Is(err, ErrOutOfTea) {\n\t\t\t\tfmt.Println(\"We should buy new tea!\")\n\t\t\t} else if errors.Is(err, ErrPower) {\n\t\t\t\tfmt.Println(\"Now it is dark.\")\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"unknown error: %s\\n\", err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tfmt.Println(\"Tea is ready!\")\n\t}\n}\n"
  },
  {
    "path": "examples/errors/errors.hash",
    "content": "b426ab07abec1cf35659afaaa5a810e116d61e8e\nxWXAMmcrbTs\n"
  },
  {
    "path": "examples/errors/errors.sh",
    "content": "$ go run errors.go\nf worked: 10\nf failed: can't work with 42\nTea is ready!\nTea is ready!\nWe should buy new tea!\nTea is ready!\nNow it is dark.\n"
  },
  {
    "path": "examples/execing-processes/execing-processes.go",
    "content": "// In the previous example we looked at\n// [spawning external processes](spawning-processes). We\n// do this when we need an external process accessible to\n// a running Go process. Sometimes we just want to\n// completely replace the current Go process with another\n// (perhaps non-Go) one. To do this we'll use Go's\n// implementation of the classic\n// <a href=\"https://en.wikipedia.org/wiki/Exec_(operating_system)\"><code>exec</code></a>\n// function.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"syscall\"\n)\n\nfunc main() {\n\n\t// For our example we'll exec `ls`. Go requires an\n\t// absolute path to the binary we want to execute, so\n\t// we'll use `exec.LookPath` to find it (probably\n\t// `/bin/ls`).\n\tbinary, lookErr := exec.LookPath(\"ls\")\n\tif lookErr != nil {\n\t\tpanic(lookErr)\n\t}\n\n\t// `Exec` requires arguments in slice form (as\n\t// opposed to one big string). We'll give `ls` a few\n\t// common arguments. Note that the first argument should\n\t// be the program name.\n\targs := []string{\"ls\", \"-a\", \"-l\", \"-h\"}\n\n\t// `Exec` also needs a set of [environment variables](environment-variables)\n\t// to use. Here we just provide our current\n\t// environment.\n\tenv := os.Environ()\n\n\t// Here's the actual `syscall.Exec` call. If this call is\n\t// successful, the execution of our process will end\n\t// here and be replaced by the `/bin/ls -a -l -h`\n\t// process. If there is an error we'll get a return\n\t// value.\n\texecErr := syscall.Exec(binary, args, env)\n\tif execErr != nil {\n\t\tpanic(execErr)\n\t}\n}\n"
  },
  {
    "path": "examples/execing-processes/execing-processes.hash",
    "content": "568ae983493addff02d2ce8df57f41daf537f077\ns9qg7olf1dM\n"
  },
  {
    "path": "examples/execing-processes/execing-processes.sh",
    "content": "# When we run our program it is replaced by `ls`.\n$ go run execing-processes.go\ntotal 16\ndrwxr-xr-x  4 mark 136B Oct 3 16:29 .\ndrwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..\n-rw-r--r--  1 mark 1.3K Oct 3 16:28 execing-processes.go\n\n# Note that Go does not offer a classic Unix `fork`\n# function. Usually this isn't an issue though, since\n# starting goroutines, spawning processes, and exec'ing\n# processes covers most use cases for `fork`.\n"
  },
  {
    "path": "examples/exit/exit.go",
    "content": "// Use `os.Exit` to immediately exit with a given\n// status.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\n\t// `defer`s will _not_ be run when using `os.Exit`, so\n\t// this `fmt.Println` will never be called.\n\tdefer fmt.Println(\"!\")\n\n\t// Exit with status 3.\n\tos.Exit(3)\n}\n\n// Note that unlike e.g. C, Go does not use an integer\n// return value from `main` to indicate exit status. If\n// you'd like to exit with a non-zero status you should\n// use `os.Exit`.\n"
  },
  {
    "path": "examples/exit/exit.hash",
    "content": "16f2c50f58d9d113f2cdd5367ddd95a220d89b19\nb9aYzlENkb__R\n"
  },
  {
    "path": "examples/exit/exit.sh",
    "content": "#  If you run `exit.go` using `go run`, the exit\n# will be picked up by `go` and printed.\n$ go run exit.go\nexit status 3\n\n# By building and executing a binary you can see\n# the status in the terminal.\n$ go build exit.go\n$ ./exit\n$ echo $?\n3\n\n# Note that the `!` from our program never got printed.\n"
  },
  {
    "path": "examples/file-paths/file-paths.go",
    "content": "// The `filepath` package provides functions to parse\n// and construct *file paths* in a way that is portable\n// between operating systems; `dir/file` on Linux vs.\n// `dir\\file` on Windows, for example.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\nfunc main() {\n\n\t// `Join` should be used to construct paths in a\n\t// portable way. It takes any number of arguments\n\t// and constructs a hierarchical path from them.\n\tp := filepath.Join(\"dir1\", \"dir2\", \"filename\")\n\tfmt.Println(\"p:\", p)\n\n\t// You should always use `Join` instead of\n\t// concatenating `/`s or `\\`s manually. In addition\n\t// to providing portability, `Join` will also\n\t// normalize paths by removing superfluous separators\n\t// and directory changes.\n\tfmt.Println(filepath.Join(\"dir1//\", \"filename\"))\n\tfmt.Println(filepath.Join(\"dir1/../dir1\", \"filename\"))\n\n\t// `Dir` and `Base` can be used to split a path to the\n\t// directory and the file. Alternatively, `Split` will\n\t// return both in the same call.\n\tfmt.Println(\"Dir(p):\", filepath.Dir(p))\n\tfmt.Println(\"Base(p):\", filepath.Base(p))\n\n\t// We can check whether a path is absolute.\n\tfmt.Println(filepath.IsAbs(\"dir/file\"))\n\tfmt.Println(filepath.IsAbs(\"/dir/file\"))\n\n\tfilename := \"config.json\"\n\n\t// Some file names have extensions following a dot. We\n\t// can split the extension out of such names with `Ext`.\n\text := filepath.Ext(filename)\n\tfmt.Println(ext)\n\n\t// To find the file's name with the extension removed,\n\t// use `strings.TrimSuffix`.\n\tfmt.Println(strings.TrimSuffix(filename, ext))\n\n\t// `Rel` finds a relative path between a *base* and a\n\t// *target*. It returns an error if the target cannot\n\t// be made relative to base.\n\trel, err := filepath.Rel(\"a/b\", \"a/b/t/file\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(rel)\n\n\trel, err = filepath.Rel(\"a/b\", \"a/c/t/file\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(rel)\n}\n"
  },
  {
    "path": "examples/file-paths/file-paths.hash",
    "content": "10823f6a3f4daea097a91374efa88c4361932488\n5h3lUytvmyO\n"
  },
  {
    "path": "examples/file-paths/file-paths.sh",
    "content": "$ go run file-paths.go\np: dir1/dir2/filename\ndir1/filename\ndir1/filename\nDir(p): dir1/dir2\nBase(p): filename\nfalse\ntrue\n.json\nconfig\nt/file\n../c/t/file\n"
  },
  {
    "path": "examples/for/for.go",
    "content": "// `for` is Go's only looping construct. Here are\n// some basic types of `for` loops.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// The most basic type, with a single condition.\n\ti := 1\n\tfor i <= 3 {\n\t\tfmt.Println(i)\n\t\ti = i + 1\n\t}\n\n\t// A classic initial/condition/after `for` loop.\n\tfor j := 0; j < 3; j++ {\n\t\tfmt.Println(j)\n\t}\n\n\t// Another way of accomplishing the basic \"do this\n\t// N times\" iteration is `range` over an integer.\n\tfor i := range 3 {\n\t\tfmt.Println(\"range\", i)\n\t}\n\n\t// `for` without a condition will loop repeatedly\n\t// until you `break` out of the loop or `return` from\n\t// the enclosing function.\n\tfor {\n\t\tfmt.Println(\"loop\")\n\t\tbreak\n\t}\n\n\t// You can also `continue` to the next iteration of\n\t// the loop.\n\tfor n := range 6 {\n\t\tif n%2 == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tfmt.Println(n)\n\t}\n}\n"
  },
  {
    "path": "examples/for/for.hash",
    "content": "8eeb5be15c3c5fc3f9d0d8009dfcec771dc5e03d\n_F2rYHNilKa\n"
  },
  {
    "path": "examples/for/for.sh",
    "content": "$ go run for.go\n1\n2\n3\n0\n1\n2\nrange 0\nrange 1\nrange 2\nloop\n1\n3\n5\n\n# We'll see some other `for` forms later when we look at\n# `range` statements, channels, and other data\n# structures.\n"
  },
  {
    "path": "examples/functions/functions.go",
    "content": "// _Functions_ are central in Go. We'll learn about\n// functions with a few different examples.\n\npackage main\n\nimport \"fmt\"\n\n// Here's a function that takes two `int`s and returns\n// their sum as an `int`.\nfunc plus(a int, b int) int {\n\n\t// Go requires explicit returns, i.e. it won't\n\t// automatically return the value of the last\n\t// expression.\n\treturn a + b\n}\n\n// When you have multiple consecutive parameters of\n// the same type, you may omit the type name for the\n// like-typed parameters up to the final parameter that\n// declares the type.\nfunc plusPlus(a, b, c int) int {\n\treturn a + b + c\n}\n\nfunc main() {\n\n\t// Call a function just as you'd expect, with\n\t// `name(args)`.\n\tres := plus(1, 2)\n\tfmt.Println(\"1+2 =\", res)\n\n\tres = plusPlus(1, 2, 3)\n\tfmt.Println(\"1+2+3 =\", res)\n}\n"
  },
  {
    "path": "examples/functions/functions.hash",
    "content": "94ade6d23721234a9612c9f77431106308b84953\n-o49-dQfGbK\n"
  },
  {
    "path": "examples/functions/functions.sh",
    "content": "$ go run functions.go \n1+2 = 3\n1+2+3 = 6\n\n# There are several other features to Go functions. One is\n# multiple return values, which we'll look at next.\n"
  },
  {
    "path": "examples/generics/generics.go",
    "content": "// Starting with version 1.18, Go has added support for\n// _generics_, also known as _type parameters_.\n\npackage main\n\nimport \"fmt\"\n\n// As an example of a generic function, `SlicesIndex` takes\n// a slice of any `comparable` type and an element of that\n// type and returns the index of the first occurrence of\n// v in s, or -1 if not present. The `comparable` constraint\n// means that we can compare values of this type with the\n// `==` and `!=` operators. For a more thorough explanation\n// of this type signature, see [this blog post](https://go.dev/blog/deconstructing-type-parameters).\n// Note that this function exists in the standard library\n// as [slices.Index](https://pkg.go.dev/slices#Index).\nfunc SlicesIndex[S ~[]E, E comparable](s S, v E) int {\n\tfor i := range s {\n\t\tif v == s[i] {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// As an example of a generic type, `List` is a\n// singly-linked list with values of any type.\ntype List[T any] struct {\n\thead, tail *element[T]\n}\n\ntype element[T any] struct {\n\tnext *element[T]\n\tval  T\n}\n\n// We can define methods on generic types just like we\n// do on regular types, but we have to keep the type\n// parameters in place. The type is `List[T]`, not `List`.\nfunc (lst *List[T]) Push(v T) {\n\tif lst.tail == nil {\n\t\tlst.head = &element[T]{val: v}\n\t\tlst.tail = lst.head\n\t} else {\n\t\tlst.tail.next = &element[T]{val: v}\n\t\tlst.tail = lst.tail.next\n\t}\n}\n\n// AllElements returns all the List elements as a slice.\n// In the next example we'll see a more idiomatic way\n// of iterating over all elements of custom types.\nfunc (lst *List[T]) AllElements() []T {\n\tvar elems []T\n\tfor e := lst.head; e != nil; e = e.next {\n\t\telems = append(elems, e.val)\n\t}\n\treturn elems\n}\n\nfunc main() {\n\tvar s = []string{\"foo\", \"bar\", \"zoo\"}\n\n\t// When invoking generic functions, we can often rely\n\t// on _type inference_. Note that we don't have to\n\t// specify the types for `S` and `E` when\n\t// calling `SlicesIndex` - the compiler infers them\n\t// automatically.\n\tfmt.Println(\"index of zoo:\", SlicesIndex(s, \"zoo\"))\n\n\t// ... though we could also specify them explicitly.\n\t_ = SlicesIndex[[]string, string](s, \"zoo\")\n\n\tlst := List[int]{}\n\tlst.Push(10)\n\tlst.Push(13)\n\tlst.Push(23)\n\tfmt.Println(\"list:\", lst.AllElements())\n}\n"
  },
  {
    "path": "examples/generics/generics.hash",
    "content": "1ad71763360077271687c5e9d147c89c0b580b0a\n7v7vElzhAeO\n"
  },
  {
    "path": "examples/generics/generics.sh",
    "content": "$ go run generics.go\nindex of zoo: 2\nlist: [10 13 23]\n"
  },
  {
    "path": "examples/goroutines/goroutines.go",
    "content": "// A _goroutine_ is a lightweight thread of execution.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc f(from string) {\n\tfor i := range 3 {\n\t\tfmt.Println(from, \":\", i)\n\t}\n}\n\nfunc main() {\n\n\t// Suppose we have a function call `f(s)`. Here's how\n\t// we'd call that in the usual way, running it\n\t// synchronously.\n\tf(\"direct\")\n\n\t// To invoke this function in a goroutine, use\n\t// `go f(s)`. This new goroutine will execute\n\t// concurrently with the calling one.\n\tgo f(\"goroutine\")\n\n\t// You can also start a goroutine for an anonymous\n\t// function call.\n\tgo func(msg string) {\n\t\tfmt.Println(msg)\n\t}(\"going\")\n\n\t// Our two function calls are running asynchronously in\n\t// separate goroutines now. Wait for them to finish\n\t// (for a more robust approach, use a [WaitGroup](waitgroups)).\n\ttime.Sleep(time.Second)\n\tfmt.Println(\"done\")\n}\n"
  },
  {
    "path": "examples/goroutines/goroutines.hash",
    "content": "b7455068d7f944d7c1a2764e5ec05bee53296e62\n0fx_WokYVFO\n"
  },
  {
    "path": "examples/goroutines/goroutines.sh",
    "content": "# When we run this program, we see the output of the\n# blocking call first, then the output of the two\n# goroutines. The goroutines' output may be interleaved,\n# because goroutines are being run concurrently by the\n# Go runtime.\n$ go run goroutines.go\ndirect : 0\ndirect : 1\ndirect : 2\ngoroutine : 0\ngoing\ngoroutine : 1\ngoroutine : 2\ndone\n\n# Next we'll look at a complement to goroutines in\n# concurrent Go programs: channels.\n"
  },
  {
    "path": "examples/hello-world/hello-world.go",
    "content": "// Our first program will print the classic \"hello world\"\n// message. Here's the full source code.\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"hello world\")\n}\n"
  },
  {
    "path": "examples/hello-world/hello-world.hash",
    "content": "3eb6e21f5f89b9a4bf64f267972a24211f0032e7\nNeviD0awXjt\n"
  },
  {
    "path": "examples/hello-world/hello-world.sh",
    "content": "# To run the program, put the code in `hello-world.go` and\n# use `go run`.\n$ go run hello-world.go\nhello world\n\n# Sometimes we'll want to build our programs into\n# binaries. We can do this using `go build`.\n$ go build hello-world.go\n$ ls\nhello-world\thello-world.go\n\n# We can then execute the built binary directly.\n$ ./hello-world\nhello world\n\n# Now that we can run and build basic Go programs, let's\n# learn more about the language.\n"
  },
  {
    "path": "examples/http-client/http-client.go",
    "content": "// The Go standard library comes with excellent support\n// for HTTP clients and servers in the `net/http`\n// package. In this example we'll use it to issue simple\n// HTTP requests.\npackage main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"net/http\"\n)\n\nfunc main() {\n\n\t// Issue an HTTP GET request to a server. `http.Get` is a\n\t// convenient shortcut around creating an `http.Client`\n\t// object and calling its `Get` method; it uses the\n\t// `http.DefaultClient` object which has useful default\n\t// settings.\n\tresp, err := http.Get(\"https://gobyexample.com\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer resp.Body.Close()\n\n\t// Print the HTTP response status.\n\tfmt.Println(\"Response status:\", resp.Status)\n\n\t// Print the first 5 lines of the response body.\n\tscanner := bufio.NewScanner(resp.Body)\n\tfor i := 0; scanner.Scan() && i < 5; i++ {\n\t\tfmt.Println(scanner.Text())\n\t}\n\n\tif err := scanner.Err(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/http-client/http-client.hash",
    "content": "1497e193431e4740f593039f613773daaf97772e\nvFW_el7oHMk\n"
  },
  {
    "path": "examples/http-client/http-client.sh",
    "content": "$ go run http-clients.go\nResponse status: 200 OK\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example</title>\n"
  },
  {
    "path": "examples/http-server/http-server.go",
    "content": "// Writing a basic HTTP server is easy using the\n// `net/http` package.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n)\n\n// A fundamental concept in `net/http` servers is\n// *handlers*. A handler is an object implementing the\n// `http.Handler` interface. A common way to write\n// a handler is by using the `http.HandlerFunc` adapter\n// on functions with the appropriate signature.\nfunc hello(w http.ResponseWriter, req *http.Request) {\n\n\t// Functions serving as handlers take a\n\t// `http.ResponseWriter` and a `http.Request` as\n\t// arguments. The response writer is used to fill in the\n\t// HTTP response. Here our simple response is just\n\t// \"hello\\n\".\n\tfmt.Fprintf(w, \"hello\\n\")\n}\n\nfunc headers(w http.ResponseWriter, req *http.Request) {\n\n\t// This handler does something a little more\n\t// sophisticated by reading all the HTTP request\n\t// headers and echoing them into the response body.\n\tfor name, headers := range req.Header {\n\t\tfor _, h := range headers {\n\t\t\tfmt.Fprintf(w, \"%v: %v\\n\", name, h)\n\t\t}\n\t}\n}\n\nfunc main() {\n\n\t// We register our handlers on server routes using the\n\t// `http.HandleFunc` convenience function. It sets up\n\t// the *default router* in the `net/http` package and\n\t// takes a function as an argument.\n\thttp.HandleFunc(\"/hello\", hello)\n\thttp.HandleFunc(\"/headers\", headers)\n\n\t// Finally, we call the `ListenAndServe` with the port\n\t// and a handler. `nil` tells it to use the default\n\t// router we've just set up.\n\thttp.ListenAndServe(\":8090\", nil)\n}\n"
  },
  {
    "path": "examples/http-server/http-server.hash",
    "content": "7694e4f5c3907e999331bbab9ead9743b6e9c6b7\ns3xMMt9Ytry\n"
  },
  {
    "path": "examples/http-server/http-server.sh",
    "content": "# Run the server in the background.\n$ go run http-server.go &\n\n# Access the `/hello` route.\n$ curl localhost:8090/hello\nhello\n"
  },
  {
    "path": "examples/if-else/if-else.go",
    "content": "// Branching with `if` and `else` in Go is\n// straight-forward.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// Here's a basic example.\n\tif 7%2 == 0 {\n\t\tfmt.Println(\"7 is even\")\n\t} else {\n\t\tfmt.Println(\"7 is odd\")\n\t}\n\n\t// You can have an `if` statement without an else.\n\tif 8%4 == 0 {\n\t\tfmt.Println(\"8 is divisible by 4\")\n\t}\n\n\t// Logical operators like `&&` and `||` are often\n\t// useful in conditions.\n\tif 8%2 == 0 || 7%2 == 0 {\n\t\tfmt.Println(\"either 8 or 7 are even\")\n\t}\n\n\t// A statement can precede conditionals; any variables\n\t// declared in this statement are available in the current\n\t// and all subsequent branches.\n\tif num := 9; num < 0 {\n\t\tfmt.Println(num, \"is negative\")\n\t} else if num < 10 {\n\t\tfmt.Println(num, \"has 1 digit\")\n\t} else {\n\t\tfmt.Println(num, \"has multiple digits\")\n\t}\n}\n\n// Note that you don't need parentheses around conditions\n// in Go, but that the braces are required.\n"
  },
  {
    "path": "examples/if-else/if-else.hash",
    "content": "fd9e491f9891e6a9593c2c1d640c1df113ce3ccf\nRKgKzCe7qcF\n"
  },
  {
    "path": "examples/if-else/if-else.sh",
    "content": "$ go run if-else.go\n7 is odd\n8 is divisible by 4\neither 8 or 7 are even\n9 has 1 digit\n\n# There is no [ternary if](https://en.wikipedia.org/wiki/%3F:)\n# in Go, so you'll need to use a full `if` statement even\n# for basic conditions.\n"
  },
  {
    "path": "examples/interfaces/interfaces.go",
    "content": "// _Interfaces_ are named collections of method\n// signatures.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\n// Here's a basic interface for geometric shapes.\ntype geometry interface {\n\tarea() float64\n\tperim() float64\n}\n\n// For our example we'll implement this interface on\n// `rect` and `circle` types.\ntype rect struct {\n\twidth, height float64\n}\ntype circle struct {\n\tradius float64\n}\n\n// To implement an interface in Go, we just need to\n// implement all the methods in the interface. Here we\n// implement `geometry` on `rect`s.\nfunc (r rect) area() float64 {\n\treturn r.width * r.height\n}\nfunc (r rect) perim() float64 {\n\treturn 2*r.width + 2*r.height\n}\n\n// The implementation for `circle`s.\nfunc (c circle) area() float64 {\n\treturn math.Pi * c.radius * c.radius\n}\nfunc (c circle) perim() float64 {\n\treturn 2 * math.Pi * c.radius\n}\n\n// If a variable has an interface type, then we can call\n// methods that are in the named interface. Here's a\n// generic `measure` function taking advantage of this\n// to work on any `geometry`.\nfunc measure(g geometry) {\n\tfmt.Println(g)\n\tfmt.Println(g.area())\n\tfmt.Println(g.perim())\n}\n\n// Sometimes it's useful to know the runtime type of an\n// interface value. One option is using a *type assertion*\n// as shown here; another is a [type `switch`](switch).\nfunc detectCircle(g geometry) {\n\tif c, ok := g.(circle); ok {\n\t\tfmt.Println(\"circle with radius\", c.radius)\n\t}\n}\n\nfunc main() {\n\tr := rect{width: 3, height: 4}\n\tc := circle{radius: 5}\n\n\t// The `circle` and `rect` struct types both\n\t// implement the `geometry` interface so we can use\n\t// instances of\n\t// these structs as arguments to `measure`.\n\tmeasure(r)\n\tmeasure(c)\n\n\tdetectCircle(r)\n\tdetectCircle(c)\n}\n"
  },
  {
    "path": "examples/interfaces/interfaces.hash",
    "content": "6324a4bdb756a0ec2ccc60e13c97d2650e730ed6\nxAAbgd7GOKD\n"
  },
  {
    "path": "examples/interfaces/interfaces.sh",
    "content": "$ go run interfaces.go\n{3 4}\n12\n14\n{5}\n78.53981633974483\n31.41592653589793\ncircle with radius 5\n\n# To understand how Go's interfaces work under the hood,\n# check out this [blog post](https://research.swtch.com/interfaces).\n"
  },
  {
    "path": "examples/json/json.go",
    "content": "// Go offers built-in support for JSON encoding and\n// decoding, including to and from built-in and custom\n// data types.\n\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\n// We'll use these two structs to demonstrate encoding and\n// decoding of custom types below.\ntype response1 struct {\n\tPage   int\n\tFruits []string\n}\n\n// Only exported fields will be encoded/decoded in JSON.\n// Fields must start with capital letters to be exported.\ntype response2 struct {\n\tPage   int      `json:\"page\"`\n\tFruits []string `json:\"fruits\"`\n}\n\nfunc main() {\n\n\t// First we'll look at encoding basic data types to\n\t// JSON strings. Here are some examples for atomic\n\t// values.\n\tbolB, _ := json.Marshal(true)\n\tfmt.Println(string(bolB))\n\n\tintB, _ := json.Marshal(1)\n\tfmt.Println(string(intB))\n\n\tfltB, _ := json.Marshal(2.34)\n\tfmt.Println(string(fltB))\n\n\tstrB, _ := json.Marshal(\"gopher\")\n\tfmt.Println(string(strB))\n\n\t// And here are some for slices and maps, which encode\n\t// to JSON arrays and objects as you'd expect.\n\tslcD := []string{\"apple\", \"peach\", \"pear\"}\n\tslcB, _ := json.Marshal(slcD)\n\tfmt.Println(string(slcB))\n\n\tmapD := map[string]int{\"apple\": 5, \"lettuce\": 7}\n\tmapB, _ := json.Marshal(mapD)\n\tfmt.Println(string(mapB))\n\n\t// The JSON package can automatically encode your\n\t// custom data types. It will only include exported\n\t// fields in the encoded output and will by default\n\t// use those names as the JSON keys.\n\tres1D := &response1{\n\t\tPage:   1,\n\t\tFruits: []string{\"apple\", \"peach\", \"pear\"}}\n\tres1B, _ := json.Marshal(res1D)\n\tfmt.Println(string(res1B))\n\n\t// You can use tags on struct field declarations\n\t// to customize the encoded JSON key names. Check the\n\t// definition of `response2` above to see an example\n\t// of such tags.\n\tres2D := &response2{\n\t\tPage:   1,\n\t\tFruits: []string{\"apple\", \"peach\", \"pear\"}}\n\tres2B, _ := json.Marshal(res2D)\n\tfmt.Println(string(res2B))\n\n\t// Now let's look at decoding JSON data into Go\n\t// values. Here's an example for a generic data\n\t// structure.\n\tbyt := []byte(`{\"num\":6.13,\"strs\":[\"a\",\"b\"]}`)\n\n\t// We need to provide a variable where the JSON\n\t// package can put the decoded data. This\n\t// `map[string]interface{}` will hold a map of strings\n\t// to arbitrary data types.\n\tvar dat map[string]interface{}\n\n\t// Here's the actual decoding, and a check for\n\t// associated errors.\n\tif err := json.Unmarshal(byt, &dat); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(dat)\n\n\t// In order to use the values in the decoded map,\n\t// we'll need to convert them to their appropriate type.\n\t// For example here we convert the value in `num` to\n\t// the expected `float64` type.\n\tnum := dat[\"num\"].(float64)\n\tfmt.Println(num)\n\n\t// Accessing nested data requires a series of\n\t// conversions.\n\tstrs := dat[\"strs\"].([]interface{})\n\tstr1 := strs[0].(string)\n\tfmt.Println(str1)\n\n\t// We can also decode JSON into custom data types.\n\t// This has the advantages of adding additional\n\t// type-safety to our programs and eliminating the\n\t// need for type assertions when accessing the decoded\n\t// data.\n\tstr := `{\"page\": 1, \"fruits\": [\"apple\", \"peach\"]}`\n\tres := response2{}\n\tjson.Unmarshal([]byte(str), &res)\n\tfmt.Println(res)\n\tfmt.Println(res.Fruits[0])\n\n\t// In the examples above we always used bytes and\n\t// strings as intermediates between the data and\n\t// JSON representation on standard out. We can also\n\t// stream JSON encodings directly to `os.Writer`s like\n\t// `os.Stdout` or even HTTP response bodies.\n\tenc := json.NewEncoder(os.Stdout)\n\td := map[string]int{\"apple\": 5, \"lettuce\": 7}\n\tenc.Encode(d)\n\n\t// Streaming reads from `os.Reader`s like `os.Stdin`\n\t// or HTTP request bodies is done with `json.Decoder`.\n\tdec := json.NewDecoder(strings.NewReader(str))\n\tres1 := response2{}\n\tdec.Decode(&res1)\n\tfmt.Println(res1)\n}\n"
  },
  {
    "path": "examples/json/json.hash",
    "content": "db25fb3a8b52215441ebe0a5d6a4d4f1a8be5917\nzwf9dZ4pUPW\n"
  },
  {
    "path": "examples/json/json.sh",
    "content": "$ go run json.go\ntrue\n1\n2.34\n\"gopher\"\n[\"apple\",\"peach\",\"pear\"]\n{\"apple\":5,\"lettuce\":7}\n{\"Page\":1,\"Fruits\":[\"apple\",\"peach\",\"pear\"]}\n{\"page\":1,\"fruits\":[\"apple\",\"peach\",\"pear\"]}\nmap[num:6.13 strs:[a b]]\n6.13\na\n{1 [apple peach]}\napple\n{\"apple\":5,\"lettuce\":7}\n{1 [apple peach]}\n\n\n# We've covered the basic of JSON in Go here, but check\n# out the [JSON and Go](https://go.dev/blog/json)\n# blog post and [JSON package docs](https://pkg.go.dev/encoding/json)\n# for more.\n"
  },
  {
    "path": "examples/line-filters/line-filters.go",
    "content": "// A _line filter_ is a common type of program that reads\n// input on stdin, processes it, and then prints some\n// derived result to stdout. `grep` and `sed` are common\n// line filters.\n\n// Here's an example line filter in Go that writes a\n// capitalized version of all input text. You can use this\n// pattern to write your own Go line filters.\npackage main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc main() {\n\n\t// Wrapping the unbuffered `os.Stdin` with a buffered\n\t// scanner gives us a convenient `Scan` method that\n\t// advances the scanner to the next token; which is\n\t// the next line in the default scanner.\n\tscanner := bufio.NewScanner(os.Stdin)\n\n\tfor scanner.Scan() {\n\t\t// `Text` returns the current token, here the next line,\n\t\t// from the input.\n\t\tucl := strings.ToUpper(scanner.Text())\n\n\t\t// Write out the uppercased line.\n\t\tfmt.Println(ucl)\n\t}\n\n\t// Check for errors during `Scan`. End of file is\n\t// expected and not reported by `Scan` as an error.\n\tif err := scanner.Err(); err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"error:\", err)\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "examples/line-filters/line-filters.hash",
    "content": "42fd593180c40f71839f05447cc0a70d7cd213d1\nkNcupWRsYPP\n"
  },
  {
    "path": "examples/line-filters/line-filters.sh",
    "content": "# To try out our line filter, first make a file with a few\n# lowercase lines.\n$ echo 'hello'   > /tmp/lines\n$ echo 'filter' >> /tmp/lines\n\n# Then use the line filter to get uppercase lines.\n$ cat /tmp/lines | go run line-filters.go\nHELLO\nFILTER\n"
  },
  {
    "path": "examples/logging/logging.go",
    "content": "// The Go standard library provides straightforward\n// tools for outputting logs from Go programs, with\n// the [log](https://pkg.go.dev/log) package for\n// free-form output and the\n// [log/slog](https://pkg.go.dev/log/slog) package for\n// structured output.\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"log/slog\"\n)\n\nfunc main() {\n\n\t// Simply invoking functions like `Println` from the\n\t// `log` package uses the _standard_ logger, which\n\t// is already pre-configured for reasonable logging\n\t// output to `os.Stderr`. Additional methods like\n\t// `Fatal*` or `Panic*` will exit the program after\n\t// logging.\n\tlog.Println(\"standard logger\")\n\n\t// Loggers can be configured with _flags_ to set\n\t// their output format. By default, the standard\n\t// logger has the `log.Ldate` and `log.Ltime` flags\n\t// set, and these are collected in `log.LstdFlags`.\n\t// We can change its flags to emit time with\n\t// microsecond accuracy, for example.\n\tlog.SetFlags(log.LstdFlags | log.Lmicroseconds)\n\tlog.Println(\"with micro\")\n\n\t// It also supports emitting the file name and\n\t// line from which the `log` function is called.\n\tlog.SetFlags(log.LstdFlags | log.Lshortfile)\n\tlog.Println(\"with file/line\")\n\n\t// It may be useful to create a custom logger and\n\t// pass it around. When creating a new logger, we\n\t// can set a _prefix_ to distinguish its output\n\t// from other loggers.\n\tmylog := log.New(os.Stdout, \"my:\", log.LstdFlags)\n\tmylog.Println(\"from mylog\")\n\n\t// We can set the prefix\n\t// on existing loggers (including the standard one)\n\t// with the `SetPrefix` method.\n\tmylog.SetPrefix(\"ohmy:\")\n\tmylog.Println(\"from mylog\")\n\n\t// Loggers can have custom output targets;\n\t// any `io.Writer` works.\n\tvar buf bytes.Buffer\n\tbuflog := log.New(&buf, \"buf:\", log.LstdFlags)\n\n\t// This call writes the log output into `buf`.\n\tbuflog.Println(\"hello\")\n\n\t// This will actually show it on standard output.\n\tfmt.Print(\"from buflog:\", buf.String())\n\n\t// The `slog` package provides\n\t// _structured_ log output. For example, logging\n\t// in JSON format is straightforward.\n\tjsonHandler := slog.NewJSONHandler(os.Stderr, nil)\n\tmyslog := slog.New(jsonHandler)\n\tmyslog.Info(\"hi there\")\n\n\t// In addition to the message, `slog` output can\n\t// contain an arbitrary number of key=value\n\t// pairs.\n\tmyslog.Info(\"hello again\", \"key\", \"val\", \"age\", 25)\n}\n"
  },
  {
    "path": "examples/logging/logging.hash",
    "content": "38a7ef451859bb4c163df938b3a9d0e5ac293bef\nQd0uCqBlYUn\n"
  },
  {
    "path": "examples/logging/logging.sh",
    "content": "# Sample output; the date and time\n# emitted will depend on when the example ran.\n$ go run logging.go\n2023/08/22 10:45:16 standard logger\n2023/08/22 10:45:16.904141 with micro\n2023/08/22 10:45:16 logging.go:40: with file/line\nmy:2023/08/22 10:45:16 from mylog\nohmy:2023/08/22 10:45:16 from mylog\nfrom buflog:buf:2023/08/22 10:45:16 hello\n\n# These are wrapped for clarity of presentation\n# on the website; in reality they are emitted\n# on a single line.\n{\"time\":\"2023-08-22T10:45:16.904166391-07:00\",\n \"level\":\"INFO\",\"msg\":\"hi there\"}\n{\"time\":\"2023-08-22T10:45:16.904178985-07:00\",\n\t\"level\":\"INFO\",\"msg\":\"hello again\",\n\t\"key\":\"val\",\"age\":25}\n"
  },
  {
    "path": "examples/maps/maps.go",
    "content": "// _Maps_ are Go's built-in [associative data type](https://en.wikipedia.org/wiki/Associative_array)\n// (sometimes called _hashes_ or _dicts_ in other languages).\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n)\n\nfunc main() {\n\n\t// To create an empty map, use the builtin `make`:\n\t// `make(map[key-type]val-type)`.\n\tm := make(map[string]int)\n\n\t// Set key/value pairs using typical `name[key] = val`\n\t// syntax.\n\tm[\"k1\"] = 7\n\tm[\"k2\"] = 13\n\n\t// Printing a map with e.g. `fmt.Println` will show all of\n\t// its key/value pairs.\n\tfmt.Println(\"map:\", m)\n\n\t// Get a value for a key with `name[key]`.\n\tv1 := m[\"k1\"]\n\tfmt.Println(\"v1:\", v1)\n\n\t// If the key doesn't exist, the\n\t// [zero value](https://go.dev/ref/spec#The_zero_value) of the\n\t// value type is returned.\n\tv3 := m[\"k3\"]\n\tfmt.Println(\"v3:\", v3)\n\n\t// The builtin `len` returns the number of key/value\n\t// pairs when called on a map.\n\tfmt.Println(\"len:\", len(m))\n\n\t// The builtin `delete` removes key/value pairs from\n\t// a map.\n\tdelete(m, \"k2\")\n\tfmt.Println(\"map:\", m)\n\n\t// To remove *all* key/value pairs from a map, use\n\t// the `clear` builtin.\n\tclear(m)\n\tfmt.Println(\"map:\", m)\n\n\t// The optional second return value when getting a\n\t// value from a map indicates if the key was present\n\t// in the map. This can be used to disambiguate\n\t// between missing keys and keys with zero values\n\t// like `0` or `\"\"`. Here we didn't need the value\n\t// itself, so we ignored it with the _blank identifier_\n\t// `_`.\n\t_, prs := m[\"k2\"]\n\tfmt.Println(\"prs:\", prs)\n\n\t// You can also declare and initialize a new map in\n\t// the same line with this syntax.\n\tn := map[string]int{\"foo\": 1, \"bar\": 2}\n\tfmt.Println(\"map:\", n)\n\n\t// The `maps` package contains a number of useful\n\t// utility functions for maps.\n\tn2 := map[string]int{\"foo\": 1, \"bar\": 2}\n\tif maps.Equal(n, n2) {\n\t\tfmt.Println(\"n == n2\")\n\t}\n}\n"
  },
  {
    "path": "examples/maps/maps.hash",
    "content": "c8435b8cc754213b70c58c9a51dfa824c6f70dd7\n5jpkxJ2T0Lv\n"
  },
  {
    "path": "examples/maps/maps.sh",
    "content": "# Note that maps appear in the form `map[k:v k:v]` when\n# printed with `fmt.Println`.\n$ go run maps.go \nmap: map[k1:7 k2:13]\nv1: 7\nv3: 0\nlen: 2\nmap: map[k1:7]\nmap: map[]\nprs: false\nmap: map[bar:2 foo:1]\nn == n2\n"
  },
  {
    "path": "examples/methods/methods.go",
    "content": "// Go supports _methods_ defined on struct types.\n\npackage main\n\nimport \"fmt\"\n\ntype rect struct {\n\twidth, height int\n}\n\n// This `area` method has a _receiver type_ of `*rect`.\nfunc (r *rect) area() int {\n\treturn r.width * r.height\n}\n\n// Methods can be defined for either pointer or value\n// receiver types. Here's an example of a value receiver.\nfunc (r rect) perim() int {\n\treturn 2*r.width + 2*r.height\n}\n\nfunc main() {\n\tr := rect{width: 10, height: 5}\n\n\t// Here we call the 2 methods defined for our struct.\n\tfmt.Println(\"area: \", r.area())\n\tfmt.Println(\"perim:\", r.perim())\n\n\t// Go automatically handles conversion between values\n\t// and pointers for method calls. You may want to use\n\t// a pointer receiver type to avoid copying on method\n\t// calls or to allow the method to mutate the\n\t// receiving struct.\n\trp := &r\n\tfmt.Println(\"area: \", rp.area())\n\tfmt.Println(\"perim:\", rp.perim())\n}\n"
  },
  {
    "path": "examples/methods/methods.hash",
    "content": "8c5af60ad04b3e9baa62a85924f829711abe94d4\n4wmDCAydC1e\n"
  },
  {
    "path": "examples/methods/methods.sh",
    "content": "$ go run methods.go \narea:  50\nperim: 30\narea:  50\nperim: 30\n\n# Next we'll look at Go's mechanism for grouping and\n# naming related sets of methods: interfaces.\n"
  },
  {
    "path": "examples/multiple-return-values/multiple-return-values.go",
    "content": "// Go has built-in support for _multiple return values_.\n// This feature is used often in idiomatic Go, for example\n// to return both result and error values from a function.\n\npackage main\n\nimport \"fmt\"\n\n// The `(int, int)` in this function signature shows that\n// the function returns 2 `int`s.\nfunc vals() (int, int) {\n\treturn 3, 7\n}\n\nfunc main() {\n\n\t// Here we use the 2 different return values from the\n\t// call with _multiple assignment_.\n\ta, b := vals()\n\tfmt.Println(a)\n\tfmt.Println(b)\n\n\t// If you only want a subset of the returned values,\n\t// use the blank identifier `_`.\n\t_, c := vals()\n\tfmt.Println(c)\n}\n"
  },
  {
    "path": "examples/multiple-return-values/multiple-return-values.hash",
    "content": "c6e4f5dd9c55b5d2aaeb7e939c216ec76f042501\nvZdUvLB1WbK\n"
  },
  {
    "path": "examples/multiple-return-values/multiple-return-values.sh",
    "content": "$ go run multiple-return-values.go\n3\n7\n7\n\n# Accepting a variable number of arguments is another nice\n# feature of Go functions; we'll look at this next.\n"
  },
  {
    "path": "examples/mutexes/mutexes.go",
    "content": "// In the previous example we saw how to manage simple\n// counter state using [atomic operations](atomic-counters).\n// For more complex state we can use a [_mutex_](https://en.wikipedia.org/wiki/Mutual_exclusion)\n// to safely access data across multiple goroutines.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\n// Container holds a map of counters; since we want to\n// update it concurrently from multiple goroutines, we\n// add a `Mutex` to synchronize access.\n// Note that mutexes must not be copied, so if this\n// `struct` is passed around, it should be done by\n// pointer.\ntype Container struct {\n\tmu       sync.Mutex\n\tcounters map[string]int\n}\n\nfunc (c *Container) inc(name string) {\n\t// Lock the mutex before accessing `counters`; unlock\n\t// it at the end of the function using a [defer](defer)\n\t// statement.\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tc.counters[name]++\n}\n\nfunc main() {\n\tc := Container{\n\t\t// Note that the zero value of a mutex is usable as-is, so no\n\t\t// initialization is required here.\n\t\tcounters: map[string]int{\"a\": 0, \"b\": 0},\n\t}\n\n\tvar wg sync.WaitGroup\n\n\t// This function increments a named counter\n\t// in a loop.\n\tdoIncrement := func(name string, n int) {\n\t\tfor range n {\n\t\t\tc.inc(name)\n\t\t}\n\t}\n\n\t// Run several goroutines concurrently; note\n\t// that they all access the same `Container`,\n\t// and two of them access the same counter.\n\twg.Go(func() {\n\t\tdoIncrement(\"a\", 10000)\n\t})\n\n\twg.Go(func() {\n\t\tdoIncrement(\"a\", 10000)\n\t})\n\n\twg.Go(func() {\n\t\tdoIncrement(\"b\", 10000)\n\t})\n\n\t// Wait for the goroutines to finish\n\twg.Wait()\n\tfmt.Println(c.counters)\n}\n"
  },
  {
    "path": "examples/mutexes/mutexes.hash",
    "content": "5271a346794ed097df21fb0f2b2d3d01c9bb361c\nu0VAVSWRlU0\n"
  },
  {
    "path": "examples/mutexes/mutexes.sh",
    "content": "# Running the program shows that the counters\n# updated as expected.\n$ go run mutexes.go\nmap[a:20000 b:10000]\n\n# Next we'll look at implementing this same state\n# management task using only goroutines and channels.\n"
  },
  {
    "path": "examples/non-blocking-channel-operations/non-blocking-channel-operations.go",
    "content": "// Basic sends and receives on channels are blocking.\n// However, we can use `select` with a `default` clause to\n// implement _non-blocking_ sends, receives, and even\n// non-blocking multi-way `select`s.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tmessages := make(chan string)\n\tsignals := make(chan bool)\n\n\t// Here's a non-blocking receive. If a value is\n\t// available on `messages` then `select` will take\n\t// the `<-messages` `case` with that value. If not\n\t// it will immediately take the `default` case.\n\tselect {\n\tcase msg := <-messages:\n\t\tfmt.Println(\"received message\", msg)\n\tdefault:\n\t\tfmt.Println(\"no message received\")\n\t}\n\n\t// A non-blocking send works similarly. Here `msg`\n\t// cannot be sent to the `messages` channel, because\n\t// the channel has no buffer and there is no receiver.\n\t// Therefore the `default` case is selected.\n\tmsg := \"hi\"\n\tselect {\n\tcase messages <- msg:\n\t\tfmt.Println(\"sent message\", msg)\n\tdefault:\n\t\tfmt.Println(\"no message sent\")\n\t}\n\n\t// We can use multiple `case`s above the `default`\n\t// clause to implement a multi-way non-blocking\n\t// select. Here we attempt non-blocking receives\n\t// on both `messages` and `signals`.\n\tselect {\n\tcase msg := <-messages:\n\t\tfmt.Println(\"received message\", msg)\n\tcase sig := <-signals:\n\t\tfmt.Println(\"received signal\", sig)\n\tdefault:\n\t\tfmt.Println(\"no activity\")\n\t}\n}\n"
  },
  {
    "path": "examples/non-blocking-channel-operations/non-blocking-channel-operations.hash",
    "content": "40588abf859a0280d8c71b79732e869eb2da9291\nTFv6-7OVNVq\n"
  },
  {
    "path": "examples/non-blocking-channel-operations/non-blocking-channel-operations.sh",
    "content": "$ go run non-blocking-channel-operations.go \nno message received\nno message sent\nno activity\n"
  },
  {
    "path": "examples/number-parsing/number-parsing.go",
    "content": "// Parsing numbers from strings is a basic but common task\n// in many programs; here's how to do it in Go.\n\npackage main\n\n// The built-in package `strconv` provides the number\n// parsing.\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\nfunc main() {\n\n\t// With `ParseFloat`, this `64` tells how many bits of\n\t// precision to parse.\n\tf, _ := strconv.ParseFloat(\"1.234\", 64)\n\tfmt.Println(f)\n\n\t// For `ParseInt`, the `0` means infer the base from\n\t// the string. `64` requires that the result fit in 64\n\t// bits.\n\ti, _ := strconv.ParseInt(\"123\", 0, 64)\n\tfmt.Println(i)\n\n\t// `ParseInt` will recognize hex-formatted numbers.\n\td, _ := strconv.ParseInt(\"0x1c8\", 0, 64)\n\tfmt.Println(d)\n\n\t// A `ParseUint` is also available.\n\tu, _ := strconv.ParseUint(\"789\", 0, 64)\n\tfmt.Println(u)\n\n\t// `Atoi` is a convenience function for basic base-10\n\t// `int` parsing.\n\tk, _ := strconv.Atoi(\"135\")\n\tfmt.Println(k)\n\n\t// Parse functions return an error on bad input.\n\t_, e := strconv.Atoi(\"wat\")\n\tfmt.Println(e)\n}\n"
  },
  {
    "path": "examples/number-parsing/number-parsing.hash",
    "content": "146b42780ac43135d97f094c6d30db364882ea17\nZAMEid6Fpmu\n"
  },
  {
    "path": "examples/number-parsing/number-parsing.sh",
    "content": "$ go run number-parsing.go \n1.234\n123\n456\n789\n135\nstrconv.ParseInt: parsing \"wat\": invalid syntax\n\n# Next we'll look at another common parsing task: URLs.\n"
  },
  {
    "path": "examples/panic/panic.go",
    "content": "// A `panic` typically means something went unexpectedly\n// wrong. Mostly we use it to fail fast on errors that\n// shouldn't occur during normal operation, or that we\n// aren't prepared to handle gracefully.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc main() {\n\n\t// We'll use panic throughout this site to check for\n\t// unexpected errors. This is the only program on the\n\t// site designed to panic.\n\tpanic(\"a problem\")\n\n\t// A common use of panic is to abort if a function\n\t// returns an error value that we don't know how to\n\t// (or want to) handle. Here's an example of\n\t// `panic`king if we get an unexpected error when creating a new file.\n\tpath := filepath.Join(os.TempDir(), \"file\")\n\t_, err := os.Create(path)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/panic/panic.hash",
    "content": "39f5cb04eb753e4c35cfc6358f24d0b5985c8556\nZ57OSC0ASwn\n"
  },
  {
    "path": "examples/panic/panic.sh",
    "content": "# Running this program will cause it to panic, print\n# an error message and goroutine traces, and exit with\n# a non-zero status.\n\n# When first panic in `main` fires, the program exits\n# without reaching the rest of the code. If you'd like\n# to see the program try to create a temp file, comment\n# the first panic out.\n$ go run panic.go\npanic: a problem\n\ngoroutine 1 [running]:\nmain.main()\n\t/.../panic.go:12 +0x47\n...\nexit status 2\n\n# Note that unlike some languages which use exceptions\n# for handling of many errors, in Go it is idiomatic\n# to use error-indicating return values wherever possible.\n"
  },
  {
    "path": "examples/pointers/pointers.go",
    "content": "// Go supports <em><a href=\"https://en.wikipedia.org/wiki/Pointer_(computer_programming)\">pointers</a></em>,\n// allowing you to pass references to values and records\n// within your program.\n\npackage main\n\nimport \"fmt\"\n\n// We'll show how pointers work in contrast to values with\n// 2 functions: `zeroval` and `zeroptr`. `zeroval` has an\n// `int` parameter, so arguments will be passed to it by\n// value. `zeroval` will get a copy of `ival` distinct\n// from the one in the calling function.\nfunc zeroval(ival int) {\n\tival = 0\n}\n\n// `zeroptr` in contrast has an `*int` parameter, meaning\n// that it takes an `int` pointer. The `*iptr` code in the\n// function body then _dereferences_ the pointer from its\n// memory address to the current value at that address.\n// Assigning a value to a dereferenced pointer changes the\n// value at the referenced address.\nfunc zeroptr(iptr *int) {\n\t*iptr = 0\n}\n\nfunc main() {\n\ti := 1\n\tfmt.Println(\"initial:\", i)\n\n\tzeroval(i)\n\tfmt.Println(\"zeroval:\", i)\n\n\t// The `&i` syntax gives the memory address of `i`,\n\t// i.e. a pointer to `i`.\n\tzeroptr(&i)\n\tfmt.Println(\"zeroptr:\", i)\n\n\t// Pointers can be printed too.\n\tfmt.Println(\"pointer:\", &i)\n}\n"
  },
  {
    "path": "examples/pointers/pointers.hash",
    "content": "7f9855cfb983efc07415117e2be734f55a6bb64b\nOlWCLpxAyBz\n"
  },
  {
    "path": "examples/pointers/pointers.sh",
    "content": "# `zeroval` doesn't change the `i` in `main`, but\n# `zeroptr` does because it has a reference to\n# the memory address for that variable.\n$ go run pointers.go\ninitial: 1\nzeroval: 1\nzeroptr: 0\npointer: 0x42131100\n"
  },
  {
    "path": "examples/random-numbers/random-numbers.go",
    "content": "// Go's `math/rand/v2` package provides\n// [pseudorandom number](https://en.wikipedia.org/wiki/Pseudorandom_number_generator)\n// generation.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math/rand/v2\"\n)\n\nfunc main() {\n\n\t// For example, `rand.IntN` returns a random `int` n,\n\t// `0 <= n < 100`.\n\tfmt.Print(rand.IntN(100), \",\")\n\tfmt.Print(rand.IntN(100))\n\tfmt.Println()\n\n\t// `rand.Float64` returns a `float64` `f`,\n\t// `0.0 <= f < 1.0`.\n\tfmt.Println(rand.Float64())\n\n\t// This can be used to generate random floats in\n\t// other ranges, for example `5.0 <= f' < 10.0`.\n\tfmt.Print((rand.Float64()*5)+5, \",\")\n\tfmt.Print((rand.Float64() * 5) + 5)\n\tfmt.Println()\n\n\t// If you want a known seed, create a new\n\t// `rand.Source` and pass it into the `New`\n\t// constructor. `NewPCG` creates a new\n\t// [PCG](https://en.wikipedia.org/wiki/Permuted_congruential_generator)\n\t// source that requires a seed of two `uint64`\n\t// numbers.\n\ts2 := rand.NewPCG(42, 1024)\n\tr2 := rand.New(s2)\n\tfmt.Print(r2.IntN(100), \",\")\n\tfmt.Print(r2.IntN(100))\n\tfmt.Println()\n\n\ts3 := rand.NewPCG(42, 1024)\n\tr3 := rand.New(s3)\n\tfmt.Print(r3.IntN(100), \",\")\n\tfmt.Print(r3.IntN(100))\n\tfmt.Println()\n}\n"
  },
  {
    "path": "examples/random-numbers/random-numbers.hash",
    "content": "76b8f86171ffcf9e7d5781fdf50c050a824acd9b\nTkgmNAl8euK\n"
  },
  {
    "path": "examples/random-numbers/random-numbers.sh",
    "content": "# Some of the generated numbers may be\n# different when you run the sample.\n$ go run random-numbers.go\n68,56\n0.8090228139659177\n5.840125017402497,6.937056298890035\n94,49\n94,49\n\n# See the [`math/rand/v2`](https://pkg.go.dev/math/rand/v2)\n# package docs for references on other random quantities\n# that Go can provide.\n"
  },
  {
    "path": "examples/range-over-built-in-types/range-over-built-in-types.go",
    "content": "// _range_ iterates over elements in a variety of\n// built-in data structures. Let's see how to\n// use `range` with some of the data structures\n// we've already learned.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// Here we use `range` to sum the numbers in a slice.\n\t// Arrays work like this too.\n\tnums := []int{2, 3, 4}\n\tsum := 0\n\tfor _, num := range nums {\n\t\tsum += num\n\t}\n\tfmt.Println(\"sum:\", sum)\n\n\t// `range` on arrays and slices provides both the\n\t// index and value for each entry. Above we didn't\n\t// need the index, so we ignored it with the\n\t// blank identifier `_`. Sometimes we actually want\n\t// the indexes though.\n\tfor i, num := range nums {\n\t\tif num == 3 {\n\t\t\tfmt.Println(\"index:\", i)\n\t\t}\n\t}\n\n\t// `range` on map iterates over key/value pairs.\n\tkvs := map[string]string{\"a\": \"apple\", \"b\": \"banana\"}\n\tfor k, v := range kvs {\n\t\tfmt.Printf(\"%s -> %s\\n\", k, v)\n\t}\n\n\t// `range` can also iterate over just the keys of a map.\n\tfor k := range kvs {\n\t\tfmt.Println(\"key:\", k)\n\t}\n\n\t// `range` on strings iterates over Unicode code\n\t// points. The first value is the starting byte index\n\t// of the `rune` and the second the `rune` itself.\n\t// See [Strings and Runes](strings-and-runes) for more\n\t// details.\n\tfor i, c := range \"go\" {\n\t\tfmt.Println(i, c)\n\t}\n}\n"
  },
  {
    "path": "examples/range-over-built-in-types/range-over-built-in-types.hash",
    "content": "3d8c61f02f98892be9d3ff25d48da0bfb31bbd25\nS171w0PjgsD\n"
  },
  {
    "path": "examples/range-over-built-in-types/range-over-built-in-types.sh",
    "content": "$ go run range-over-built-in-types.go\nsum: 9\nindex: 1\na -> apple\nb -> banana\nkey: a\nkey: b\n0 103\n1 111\n"
  },
  {
    "path": "examples/range-over-channels/range-over-channels.go",
    "content": "// In a [previous](range-over-built-in-types) example we saw how `for` and\n// `range` provide iteration over basic data structures.\n// We can also use this syntax to iterate over\n// values received from a channel.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// We'll iterate over 2 values in the `queue` channel.\n\tqueue := make(chan string, 2)\n\tqueue <- \"one\"\n\tqueue <- \"two\"\n\tclose(queue)\n\n\t// This `range` iterates over each element as it's\n\t// received from `queue`. Because we `close`d the\n\t// channel above, the iteration terminates after\n\t// receiving the 2 elements.\n\tfor elem := range queue {\n\t\tfmt.Println(elem)\n\t}\n}\n"
  },
  {
    "path": "examples/range-over-channels/range-over-channels.hash",
    "content": "446dea3a7cb9e16ce3e17a6649c719e764936740\n8vAhX6eX1wy\n"
  },
  {
    "path": "examples/range-over-channels/range-over-channels.sh",
    "content": "$ go run range-over-channels.go\none\ntwo\n\n# This example also showed that it's possible to close\n# a non-empty channel but still have the remaining\n# values be received.\n"
  },
  {
    "path": "examples/range-over-iterators/range-over-iterators.go",
    "content": "// Starting with version 1.23, Go has added support for\n// [iterators](https://go.dev/blog/range-functions),\n// which lets us range over pretty much anything!\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"slices\"\n\t\"strings\"\n)\n\n// Let's look at the `List` type from the\n// [previous example](generics) again. In that example\n// we had an `AllElements` method that returned a slice\n// of all elements in the list. With Go iterators, we\n// can do it better - as shown below.\ntype List[T any] struct {\n\thead, tail *element[T]\n}\n\ntype element[T any] struct {\n\tnext *element[T]\n\tval  T\n}\n\nfunc (lst *List[T]) Push(v T) {\n\tif lst.tail == nil {\n\t\tlst.head = &element[T]{val: v}\n\t\tlst.tail = lst.head\n\t} else {\n\t\tlst.tail.next = &element[T]{val: v}\n\t\tlst.tail = lst.tail.next\n\t}\n}\n\n// All returns an _iterator_, which in Go is a function\n// with a [special signature](https://pkg.go.dev/iter#Seq).\nfunc (lst *List[T]) All() iter.Seq[T] {\n\treturn func(yield func(T) bool) {\n\t\t// The iterator function takes another function as\n\t\t// a parameter, called `yield` by convention (but\n\t\t// the name can be arbitrary). It will call `yield` for\n\t\t// every element we want to iterate over, and note `yield`'s\n\t\t// return value for a potential early termination.\n\t\tfor e := lst.head; e != nil; e = e.next {\n\t\t\tif !yield(e.val) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Iteration doesn't require an underlying data structure,\n// and doesn't even have to be finite! Here's a function\n// returning an iterator over Fibonacci numbers: it keeps\n// running as long as `yield` keeps returning `true`.\nfunc genFib() iter.Seq[int] {\n\treturn func(yield func(int) bool) {\n\t\ta, b := 0, 1\n\n\t\tfor {\n\t\t\tif !yield(a) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ta, b = b, a+b\n\t\t}\n\t}\n}\n\nfunc main() {\n\tlst := List[int]{}\n\tlst.Push(10)\n\tlst.Push(13)\n\tlst.Push(23)\n\n\t// Since `List.All` returns an iterator, we can use it\n\t// in a regular `range` loop.\n\tfor e := range lst.All() {\n\t\tfmt.Println(e)\n\t}\n\n\t// Packages like [slices](https://pkg.go.dev/slices) have\n\t// a number of useful functions to work with iterators.\n\t// For example, `Collect` takes any iterator and collects\n\t// all its values into a slice.\n\tall := slices.Collect(lst.All())\n\tfmt.Println(\"all:\", all)\n\n\t// Standard library packages now expose iterator helpers\n\t// too. For example, `strings.SplitSeq` iterates over parts\n\t// of a byte slice without first building a result slice.\n\tfor part := range strings.SplitSeq(\"go-by-example\", \"-\") {\n\t\tfmt.Printf(\"part: %s\\n\", part)\n\t}\n\n\tfor n := range genFib() {\n\n\t\t// Once the loop hits `break` or an early return, the `yield` function\n\t\t// passed to the iterator will return `false`.\n\t\tif n >= 10 {\n\t\t\tbreak\n\t\t}\n\t\tfmt.Println(n)\n\t}\n}\n"
  },
  {
    "path": "examples/range-over-iterators/range-over-iterators.hash",
    "content": "d7e65d4e52957e845b0e2ca925af9ce5eff43148\nlHX3uDqdfUB\n"
  },
  {
    "path": "examples/range-over-iterators/range-over-iterators.sh",
    "content": "$ go run range-over-iterators.go\n10\n13\n23\nall: [10 13 23]\npart: go\npart: by\npart: example\n0\n1\n1\n2\n3\n5\n8\n"
  },
  {
    "path": "examples/rate-limiting/rate-limiting.go",
    "content": "// [_Rate limiting_](https://en.wikipedia.org/wiki/Rate_limiting)\n// is an important mechanism for controlling resource\n// utilization and maintaining quality of service. Go\n// elegantly supports rate limiting with goroutines,\n// channels, and [tickers](tickers).\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// First we'll look at basic rate limiting. Suppose\n\t// we want to limit our handling of incoming requests.\n\t// We'll serve these requests off a channel of the\n\t// same name.\n\trequests := make(chan int, 5)\n\tfor i := 1; i <= 5; i++ {\n\t\trequests <- i\n\t}\n\tclose(requests)\n\n\t// This `limiter` channel will receive a value\n\t// every 200 milliseconds. This is the regulator in\n\t// our rate limiting scheme.\n\tlimiter := time.Tick(200 * time.Millisecond)\n\n\t// By blocking on a receive from the `limiter` channel\n\t// before serving each request, we limit ourselves to\n\t// 1 request every 200 milliseconds.\n\tfor req := range requests {\n\t\t<-limiter\n\t\tfmt.Println(\"request\", req, time.Now())\n\t}\n\n\t// We may want to allow short bursts of requests in\n\t// our rate limiting scheme while preserving the\n\t// overall rate limit. We can accomplish this by\n\t// buffering our limiter channel. This `burstyLimiter`\n\t// channel will allow bursts of up to 3 events.\n\tburstyLimiter := make(chan time.Time, 3)\n\n\t// Fill up the channel to represent allowed bursting.\n\tfor range 3 {\n\t\tburstyLimiter <- time.Now()\n\t}\n\n\t// Every 200 milliseconds we'll try to add a new\n\t// value to `burstyLimiter`, up to its limit of 3.\n\tgo func() {\n\t\tfor t := range time.Tick(200 * time.Millisecond) {\n\t\t\tburstyLimiter <- t\n\t\t}\n\t}()\n\n\t// Now simulate 5 more incoming requests. The first\n\t// 3 of these will benefit from the burst capability\n\t// of `burstyLimiter`.\n\tburstyRequests := make(chan int, 5)\n\tfor i := 1; i <= 5; i++ {\n\t\tburstyRequests <- i\n\t}\n\tclose(burstyRequests)\n\tfor req := range burstyRequests {\n\t\t<-burstyLimiter\n\t\tfmt.Println(\"request\", req, time.Now())\n\t}\n}\n"
  },
  {
    "path": "examples/rate-limiting/rate-limiting.hash",
    "content": "c1eee474067ad718e57df5c55242ba4711e7bcb7\ny9V3goQfy5m\n"
  },
  {
    "path": "examples/rate-limiting/rate-limiting.sh",
    "content": "# Running our program we see the first batch of requests\n# handled once every ~200 milliseconds as desired.\n$ go run rate-limiting.go\nrequest 1 2012-10-19 00:38:18.687438 +0000 UTC\nrequest 2 2012-10-19 00:38:18.887471 +0000 UTC\nrequest 3 2012-10-19 00:38:19.087238 +0000 UTC\nrequest 4 2012-10-19 00:38:19.287338 +0000 UTC\nrequest 5 2012-10-19 00:38:19.487331 +0000 UTC\n\n# For the second batch of requests we serve the first\n# 3 immediately because of the burstable rate limiting,\n# then serve the remaining 2 with ~200ms delays each.\nrequest 1 2012-10-19 00:38:20.487578 +0000 UTC\nrequest 2 2012-10-19 00:38:20.487645 +0000 UTC\nrequest 3 2012-10-19 00:38:20.487676 +0000 UTC\nrequest 4 2012-10-19 00:38:20.687483 +0000 UTC\nrequest 5 2012-10-19 00:38:20.887542 +0000 UTC\n"
  },
  {
    "path": "examples/reading-files/reading-files.go",
    "content": "// Reading and writing files are basic tasks needed for\n// many Go programs. First we'll look at some examples of\n// reading files.\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// Reading files requires checking most calls for errors.\n// This helper will streamline our error checks below.\nfunc check(e error) {\n\tif e != nil {\n\t\tpanic(e)\n\t}\n}\n\nfunc main() {\n\n\t// Perhaps the most basic file reading task is\n\t// slurping a file's entire contents into memory.\n\tpath := filepath.Join(os.TempDir(), \"dat\")\n\tdat, err := os.ReadFile(path)\n\tcheck(err)\n\tfmt.Print(string(dat))\n\n\t// You'll often want more control over how and what\n\t// parts of a file are read. For these tasks, start\n\t// by `Open`ing a file to obtain an `os.File` value.\n\tf, err := os.Open(path)\n\tcheck(err)\n\n\t// Read some bytes from the beginning of the file.\n\t// Allow up to 5 to be read but also note how many\n\t// actually were read.\n\tb1 := make([]byte, 5)\n\tn1, err := f.Read(b1)\n\tcheck(err)\n\tfmt.Printf(\"%d bytes: %s\\n\", n1, string(b1[:n1]))\n\n\t// You can also `Seek` to a known location in the file\n\t// and `Read` from there.\n\to2, err := f.Seek(6, io.SeekStart)\n\tcheck(err)\n\tb2 := make([]byte, 2)\n\tn2, err := f.Read(b2)\n\tcheck(err)\n\tfmt.Printf(\"%d bytes @ %d: \", n2, o2)\n\tfmt.Printf(\"%v\\n\", string(b2[:n2]))\n\n\t// Other methods of seeking are relative to the\n\t// current cursor position,\n\t_, err = f.Seek(2, io.SeekCurrent)\n\tcheck(err)\n\n\t// and relative to the end of the file.\n\t_, err = f.Seek(-4, io.SeekEnd)\n\tcheck(err)\n\n\t// The `io` package provides some functions that may\n\t// be helpful for file reading. For example, reads\n\t// like the ones above can be more robustly\n\t// implemented with `ReadAtLeast`.\n\to3, err := f.Seek(6, io.SeekStart)\n\tcheck(err)\n\tb3 := make([]byte, 2)\n\tn3, err := io.ReadAtLeast(f, b3, 2)\n\tcheck(err)\n\tfmt.Printf(\"%d bytes @ %d: %s\\n\", n3, o3, string(b3))\n\n\t// There is no built-in rewind, but\n\t// `Seek(0, io.SeekStart)` accomplishes this.\n\t_, err = f.Seek(0, io.SeekStart)\n\tcheck(err)\n\n\t// The `bufio` package implements a buffered\n\t// reader that may be useful both for its efficiency\n\t// with many small reads and because of the additional\n\t// reading methods it provides.\n\tr4 := bufio.NewReader(f)\n\tb4, err := r4.Peek(5)\n\tcheck(err)\n\tfmt.Printf(\"5 bytes: %s\\n\", string(b4))\n\n\t// Close the file when you're done (usually this would\n\t// be scheduled immediately after `Open`ing with\n\t// `defer`).\n\tf.Close()\n}\n"
  },
  {
    "path": "examples/reading-files/reading-files.hash",
    "content": "f4a5063dc6db22beac95c6b60a8a76e3422e8cf4\nJ710-KJyC8z\n"
  },
  {
    "path": "examples/reading-files/reading-files.sh",
    "content": "$ echo \"hello\" > /tmp/dat\n$ echo \"go\" >>   /tmp/dat\n$ go run reading-files.go\nhello\ngo\n5 bytes: hello\n2 bytes @ 6: go\n2 bytes @ 6: go\n5 bytes: hello\n\n# Next we'll look at writing files.\n"
  },
  {
    "path": "examples/recover/recover.go",
    "content": "// Go makes it possible to _recover_ from a panic, by\n// using the `recover` built-in function. A `recover` can\n// stop a `panic` from aborting the program and let it\n// continue with execution instead.\n\n// An example of where this can be useful: a server\n// wouldn't want to crash if one of the client connections\n// exhibits a critical error. Instead, the server would\n// want to close that connection and continue serving\n// other clients. In fact, this is what Go's `net/http`\n// does by default for HTTP servers.\n\npackage main\n\nimport \"fmt\"\n\n// This function panics.\nfunc mayPanic() {\n\tpanic(\"a problem\")\n}\n\nfunc main() {\n\t// `recover` must be called within a deferred function.\n\t// When the enclosing function panics, the defer will\n\t// activate and a `recover` call within it will catch\n\t// the panic.\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\t// The return value of `recover` is the error raised in\n\t\t\t// the call to `panic`.\n\t\t\tfmt.Println(\"Recovered. Error:\\n\", r)\n\t\t}\n\t}()\n\n\tmayPanic()\n\n\t// This code will not run, because `mayPanic` panics.\n\t// The execution of `main` stops at the point of the\n\t// panic and resumes in the deferred closure.\n\tfmt.Println(\"After mayPanic()\")\n}\n"
  },
  {
    "path": "examples/recover/recover.hash",
    "content": "053ecbddb4f4a1d881aa40086de99da4e78b9990\nSk-SVdofEIZ\n"
  },
  {
    "path": "examples/recover/recover.sh",
    "content": "$ go run recover.go\nRecovered. Error:\n a problem\n"
  },
  {
    "path": "examples/recursion/recursion.go",
    "content": "// Go supports\n// <a href=\"https://en.wikipedia.org/wiki/Recursion_(computer_science)\"><em>recursive functions</em></a>.\n// Here's a classic example.\n\npackage main\n\nimport \"fmt\"\n\n// This `fact` function calls itself until it reaches the\n// base case of `fact(0)`.\nfunc fact(n int) int {\n\tif n == 0 {\n\t\treturn 1\n\t}\n\treturn n * fact(n-1)\n}\n\nfunc main() {\n\tfmt.Println(fact(7))\n\n\t// Anonymous functions can also be recursive, but this requires\n\t// explicitly declaring a variable with `var` to store\n\t// the function before it's defined.\n\tvar fib func(n int) int\n\n\tfib = func(n int) int {\n\t\tif n < 2 {\n\t\t\treturn n\n\t\t}\n\n\t\t// Since `fib` was previously declared in `main`, Go\n\t\t// knows which function to call with `fib` here.\n\t\treturn fib(n-1) + fib(n-2)\n\t}\n\n\tfmt.Println(fib(7))\n}\n"
  },
  {
    "path": "examples/recursion/recursion.hash",
    "content": "5787b4a187dc208dcdae43c7fdc0ba19b821ed94\nk4IRATLn9cE\n"
  },
  {
    "path": "examples/recursion/recursion.sh",
    "content": "$ go run recursion.go \n5040\n13\n"
  },
  {
    "path": "examples/regular-expressions/regular-expressions.go",
    "content": "// Go offers built-in support for [regular expressions](https://en.wikipedia.org/wiki/Regular_expression).\n// Here are some examples of  common regexp-related tasks\n// in Go.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"regexp\"\n)\n\nfunc main() {\n\n\t// This tests whether a pattern matches a string.\n\tmatch, _ := regexp.MatchString(\"p([a-z]+)ch\", \"peach\")\n\tfmt.Println(match)\n\n\t// Above we used a string pattern directly, but for\n\t// other regexp tasks you'll need to `Compile` an\n\t// optimized `Regexp` struct.\n\tr, _ := regexp.Compile(\"p([a-z]+)ch\")\n\n\t// Many methods are available on these structs. Here's\n\t// a match test like we saw earlier.\n\tfmt.Println(r.MatchString(\"peach\"))\n\n\t// This finds the match for the regexp.\n\tfmt.Println(r.FindString(\"peach punch\"))\n\n\t// This also finds the first match but returns the\n\t// start and end indexes for the match instead of the\n\t// matching text.\n\tfmt.Println(\"idx:\", r.FindStringIndex(\"peach punch\"))\n\n\t// The `Submatch` variants include information about\n\t// both the whole-pattern matches and the submatches\n\t// within those matches. For example this will return\n\t// information for both `p([a-z]+)ch` and `([a-z]+)`.\n\tfmt.Println(r.FindStringSubmatch(\"peach punch\"))\n\n\t// Similarly this will return information about the\n\t// indexes of matches and submatches.\n\tfmt.Println(r.FindStringSubmatchIndex(\"peach punch\"))\n\n\t// The `All` variants of these functions apply to all\n\t// matches in the input, not just the first. For\n\t// example to find all matches for a regexp.\n\tfmt.Println(r.FindAllString(\"peach punch pinch\", -1))\n\n\t// These `All` variants are available for the other\n\t// functions we saw above as well.\n\tfmt.Println(\"all:\", r.FindAllStringSubmatchIndex(\n\t\t\"peach punch pinch\", -1))\n\n\t// Providing a non-negative integer as the second\n\t// argument to these functions will limit the number\n\t// of matches.\n\tfmt.Println(r.FindAllString(\"peach punch pinch\", 2))\n\n\t// Our examples above had string arguments and used\n\t// names like `MatchString`. We can also provide\n\t// `[]byte` arguments and drop `String` from the\n\t// function name.\n\tfmt.Println(r.Match([]byte(\"peach\")))\n\n\t// When creating global variables with regular\n\t// expressions you can use the `MustCompile` variation\n\t// of `Compile`. `MustCompile` panics instead of\n\t// returning an error, which makes it safer to use for\n\t// global variables.\n\tr = regexp.MustCompile(\"p([a-z]+)ch\")\n\tfmt.Println(\"regexp:\", r)\n\n\t// The `regexp` package can also be used to replace\n\t// subsets of strings with other values.\n\tfmt.Println(r.ReplaceAllString(\"a peach\", \"<fruit>\"))\n\n\t// The `Func` variant allows you to transform matched\n\t// text with a given function.\n\tin := []byte(\"a peach\")\n\tout := r.ReplaceAllFunc(in, bytes.ToUpper)\n\tfmt.Println(string(out))\n}\n"
  },
  {
    "path": "examples/regular-expressions/regular-expressions.hash",
    "content": "7fd60a9497546cb5c84242276ed79aecbde7e950\nfI2YIfYsCaL\n"
  },
  {
    "path": "examples/regular-expressions/regular-expressions.sh",
    "content": "$ go run regular-expressions.go\ntrue\ntrue\npeach\nidx: [0 5]\n[peach ea]\n[0 5 1 3]\n[peach punch pinch]\nall: [[0 5 1 3] [6 11 7 9] [12 17 13 15]]\n[peach punch]\ntrue\nregexp: p([a-z]+)ch\na <fruit>\na PEACH\n\n# For a complete reference on Go regular expressions check\n# the [`regexp`](https://pkg.go.dev/regexp) package docs.\n"
  },
  {
    "path": "examples/select/select.go",
    "content": "// Go's _select_ lets you wait on multiple channel\n// operations. Combining goroutines and channels with\n// select is a powerful feature of Go.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// For our example we'll select across two channels.\n\tc1 := make(chan string)\n\tc2 := make(chan string)\n\n\t// Each channel will receive a value after some amount\n\t// of time, to simulate e.g. blocking RPC operations\n\t// executing in concurrent goroutines.\n\tgo func() {\n\t\ttime.Sleep(1 * time.Second)\n\t\tc1 <- \"one\"\n\t}()\n\tgo func() {\n\t\ttime.Sleep(2 * time.Second)\n\t\tc2 <- \"two\"\n\t}()\n\n\t// We'll use `select` to await both of these values\n\t// simultaneously, printing each one as it arrives.\n\tfor range 2 {\n\t\tselect {\n\t\tcase msg1 := <-c1:\n\t\t\tfmt.Println(\"received\", msg1)\n\t\tcase msg2 := <-c2:\n\t\t\tfmt.Println(\"received\", msg2)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/select/select.hash",
    "content": "b10a3f618c232683fba207e56e4b4cda812fd377\ndOrjUfgGwB2\n"
  },
  {
    "path": "examples/select/select.sh",
    "content": "# We receive the values `\"one\"` and then `\"two\"` as\n# expected.\n$ time go run select.go \nreceived one\nreceived two\n\n# Note that the total execution time is only ~2 seconds\n# since both the 1 and 2 second `Sleeps` execute\n# concurrently.\nreal\t0m2.245s\n"
  },
  {
    "path": "examples/sha256-hashes/sha256-hashes.go",
    "content": "// [_SHA256 hashes_](https://en.wikipedia.org/wiki/SHA-2) are\n// frequently used to compute short identities for binary\n// or text blobs. For example, TLS/SSL certificates use SHA256\n// to compute a certificate's signature. Here's how to compute\n// SHA256 hashes in Go.\n\npackage main\n\n// Go implements several hash functions in various\n// `crypto/*` packages.\nimport (\n\t\"crypto/sha256\"\n\t\"fmt\"\n)\n\nfunc main() {\n\ts := \"sha256 this string\"\n\n\t// Here we start with a new hash.\n\th := sha256.New()\n\n\t// `Write` expects bytes. If you have a string `s`,\n\t// use `[]byte(s)` to coerce it to bytes.\n\th.Write([]byte(s))\n\n\t// This gets the finalized hash result as a byte\n\t// slice. The argument to `Sum` can be used to append\n\t// to an existing byte slice: it usually isn't needed.\n\tbs := h.Sum(nil)\n\n\tfmt.Println(s)\n\tfmt.Printf(\"%x\\n\", bs)\n}\n"
  },
  {
    "path": "examples/sha256-hashes/sha256-hashes.hash",
    "content": "66d0faf25cd171218b0fc0fc341836a4f0069932\nIHM1lZVm_Jm\n"
  },
  {
    "path": "examples/sha256-hashes/sha256-hashes.sh",
    "content": "# Running the program computes the hash and prints it in\n# a human-readable hex format.\n$ go run sha256-hashes.go\nsha256 this string\n1af1dfa857bf1d8814fe1af8983c18080019922e557f15a8a...\n\n\n# You can compute other hashes using a similar pattern to\n# the one shown above. For example, to compute\n# SHA512 hashes import `crypto/sha512` and use\n# `sha512.New()`.\n\n# Note that if you need cryptographically secure hashes,\n# you should carefully research\n# [hash strength](https://en.wikipedia.org/wiki/Cryptographic_hash_function)!\n"
  },
  {
    "path": "examples/signals/signals.go",
    "content": "// Sometimes we'd like our Go programs to intelligently\n// handle [Unix signals](https://en.wikipedia.org/wiki/Unix_signal).\n// For example, we might want a server to gracefully\n// shutdown when it receives a `SIGTERM`, or a command-line\n// tool to stop processing input if it receives a `SIGINT`.\n// Here's a modern way to handle signals using contexts.\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os/signal\"\n\t\"syscall\"\n)\n\nfunc main() {\n\t// `signal.NotifyContext` returns a context that's canceled\n\t// when one of the listed signals arrives.\n\tctx, stop := signal.NotifyContext(\n\t\tcontext.Background(), syscall.SIGINT, syscall.SIGTERM)\n\tdefer stop()\n\n\t// The program will wait here until one of the\n\t// configured signals is received.\n\tfmt.Println(\"awaiting signal\")\n\t<-ctx.Done()\n\n\t// `context.Cause` reports why the context was canceled.\n\t// For a signal-triggered cancellation, this includes\n\t// the signal value.\n\tfmt.Println()\n\tfmt.Println(context.Cause(ctx))\n\tfmt.Println(\"exiting\")\n}\n"
  },
  {
    "path": "examples/signals/signals.hash",
    "content": "f55b2c52d8888d110d5909023e1dd8bfdf0846a6\nF3Wm7JT8wgn\n"
  },
  {
    "path": "examples/signals/signals.sh",
    "content": "# When we run this program it will block waiting for a\n# signal. By typing `ctrl-C` (which the\n# terminal shows as `^C`) we can send a `SIGINT` signal,\n# causing the program to print the cancellation cause and then exit.\n$ go run signals.go\nawaiting signal\n^C\ninterrupt signal received\nexiting\n"
  },
  {
    "path": "examples/slices/slices.go",
    "content": "// _Slices_ are an important data type in Go, giving\n// a more powerful interface to sequences than arrays.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n)\n\nfunc main() {\n\n\t// Unlike arrays, slices are typed only by the\n\t// elements they contain (not the number of elements).\n\t// An uninitialized slice equals to nil and has\n\t// length 0.\n\tvar s []string\n\tfmt.Println(\"uninit:\", s, s == nil, len(s) == 0)\n\n\t// To create a slice with non-zero length, use\n\t// the builtin `make`. Here we make a slice of\n\t// `string`s of length `3` (initially zero-valued).\n\t// By default a new slice's capacity is equal to its\n\t// length; if we know the slice is going to grow ahead\n\t// of time, it's possible to pass a capacity explicitly\n\t// as an additional parameter to `make`.\n\ts = make([]string, 3)\n\tfmt.Println(\"emp:\", s, \"len:\", len(s), \"cap:\", cap(s))\n\n\t// We can set and get just like with arrays.\n\ts[0] = \"a\"\n\ts[1] = \"b\"\n\ts[2] = \"c\"\n\tfmt.Println(\"set:\", s)\n\tfmt.Println(\"get:\", s[2])\n\n\t// `len` returns the length of the slice as expected.\n\tfmt.Println(\"len:\", len(s))\n\n\t// In addition to these basic operations, slices\n\t// support several more that make them richer than\n\t// arrays. One is the builtin `append`, which\n\t// returns a slice containing one or more new values.\n\t// Note that we need to accept a return value from\n\t// `append` as we may get a new slice value.\n\ts = append(s, \"d\")\n\ts = append(s, \"e\", \"f\")\n\tfmt.Println(\"apd:\", s)\n\n\t// Slices can also be `copy`'d. Here we create an\n\t// empty slice `c` of the same length as `s` and copy\n\t// into `c` from `s`.\n\tc := make([]string, len(s))\n\tcopy(c, s)\n\tfmt.Println(\"cpy:\", c)\n\n\t// Slices support a \"slice\" operator with the syntax\n\t// `slice[low:high]`. For example, this gets a slice\n\t// of the elements `s[2]`, `s[3]`, and `s[4]`.\n\tl := s[2:5]\n\tfmt.Println(\"sl1:\", l)\n\n\t// This slices up to (but excluding) `s[5]`.\n\tl = s[:5]\n\tfmt.Println(\"sl2:\", l)\n\n\t// And this slices up from (and including) `s[2]`.\n\tl = s[2:]\n\tfmt.Println(\"sl3:\", l)\n\n\t// We can declare and initialize a variable for slice\n\t// in a single line as well.\n\tt := []string{\"g\", \"h\", \"i\"}\n\tfmt.Println(\"dcl:\", t)\n\n\t// The `slices` package contains a number of useful\n\t// utility functions for slices.\n\tt2 := []string{\"g\", \"h\", \"i\"}\n\tif slices.Equal(t, t2) {\n\t\tfmt.Println(\"t == t2\")\n\t}\n\n\t// Slices can be composed into multi-dimensional data\n\t// structures. The length of the inner slices can\n\t// vary, unlike with multi-dimensional arrays.\n\ttwoD := make([][]int, 3)\n\tfor i := range 3 {\n\t\tinnerLen := i + 1\n\t\ttwoD[i] = make([]int, innerLen)\n\t\tfor j := range innerLen {\n\t\t\ttwoD[i][j] = i + j\n\t\t}\n\t}\n\tfmt.Println(\"2d: \", twoD)\n}\n"
  },
  {
    "path": "examples/slices/slices.hash",
    "content": "4db1907fd5137325a1e3c3fc50950d4250ed1a4b\n9-U3-8sKQun\n"
  },
  {
    "path": "examples/slices/slices.sh",
    "content": "# Note that while slices are different types than arrays,\n# they are rendered similarly by `fmt.Println`.\n$ go run slices.go\nuninit: [] true true\nemp: [  ] len: 3 cap: 3\nset: [a b c]\nget: c\nlen: 3\napd: [a b c d e f]\ncpy: [a b c d e f]\nsl1: [c d e]\nsl2: [a b c d e]\nsl3: [c d e f]\ndcl: [g h i]\nt == t2\n2d:  [[0] [1 2] [2 3 4]]\n\n# Check out this [great blog post](https://go.dev/blog/slices-intro)\n# by the Go team for more details on the design and\n# implementation of slices in Go.\n\n# Now that we've seen arrays and slices we'll look at\n# Go's other key builtin data structure: maps.\n"
  },
  {
    "path": "examples/sorting/sorting.go",
    "content": "// Go's `slices` package implements sorting for builtins\n// and user-defined types. We'll look at sorting for\n// builtins first.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n)\n\nfunc main() {\n\n\t// Sorting functions are generic, and work for any\n\t// _ordered_ built-in type. For a list of ordered\n\t// types, see [cmp.Ordered](https://pkg.go.dev/cmp#Ordered).\n\tstrs := []string{\"c\", \"a\", \"b\"}\n\tslices.Sort(strs)\n\tfmt.Println(\"Strings:\", strs)\n\n\t// An example of sorting `int`s.\n\tints := []int{7, 2, 4}\n\tslices.Sort(ints)\n\tfmt.Println(\"Ints:   \", ints)\n\n\t// We can also use the `slices` package to check if\n\t// a slice is already in sorted order.\n\ts := slices.IsSorted(ints)\n\tfmt.Println(\"Sorted: \", s)\n}\n"
  },
  {
    "path": "examples/sorting/sorting.hash",
    "content": "2091224c8d8ac748883215c4dbe9611fb8afacc3\nX7iJcIua02T\n"
  },
  {
    "path": "examples/sorting/sorting.sh",
    "content": "$ go run sorting.go\nStrings: [a b c]\nInts:    [2 4 7]\nSorted:  true\n"
  },
  {
    "path": "examples/sorting-by-functions/sorting-by-functions.go",
    "content": "// Sometimes we'll want to sort a collection by something\n// other than its natural order. For example, suppose we\n// wanted to sort strings by their length instead of\n// alphabetically. Here's an example of custom sorts\n// in Go.\n\npackage main\n\nimport (\n\t\"cmp\"\n\t\"fmt\"\n\t\"slices\"\n)\n\nfunc main() {\n\tfruits := []string{\"peach\", \"banana\", \"kiwi\"}\n\n\t// We implement a comparison function for string\n\t// lengths. `cmp.Compare` is helpful for this.\n\tlenCmp := func(a, b string) int {\n\t\treturn cmp.Compare(len(a), len(b))\n\t}\n\n\t// Now we can call `slices.SortFunc` with this custom\n\t// comparison function to sort `fruits` by name length.\n\tslices.SortFunc(fruits, lenCmp)\n\tfmt.Println(fruits)\n\n\t// We can use the same technique to sort a slice of\n\t// values that aren't built-in types.\n\ttype Person struct {\n\t\tname string\n\t\tage  int\n\t}\n\n\tpeople := []Person{\n\t\tPerson{name: \"Jax\", age: 37},\n\t\tPerson{name: \"TJ\", age: 25},\n\t\tPerson{name: \"Alex\", age: 72},\n\t}\n\n\t// Sort `people` by age using `slices.SortFunc`.\n\t//\n\t// Note: if the `Person` struct is large,\n\t// you may want the slice to contain `*Person` instead\n\t// and adjust the sorting function accordingly. If in\n\t// doubt, [benchmark](testing-and-benchmarking)!\n\tslices.SortFunc(people,\n\t\tfunc(a, b Person) int {\n\t\t\treturn cmp.Compare(a.age, b.age)\n\t\t})\n\tfmt.Println(people)\n}\n"
  },
  {
    "path": "examples/sorting-by-functions/sorting-by-functions.hash",
    "content": "9902d1c5654b64d8b381ea7888c0793ac8ab4a97\n3EaTknAZHMu\n"
  },
  {
    "path": "examples/sorting-by-functions/sorting-by-functions.sh",
    "content": "$ go run sorting-by-functions.go \n[kiwi peach banana]\n[{TJ 25} {Jax 37} {Alex 72}]\n"
  },
  {
    "path": "examples/spawning-processes/spawning-processes.go",
    "content": "// Sometimes our Go programs need to spawn other\n// processes.\n\npackage main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n)\n\nfunc main() {\n\n\t// We'll start with a simple command that takes no\n\t// arguments or input and just prints something to\n\t// stdout. The `exec.Command` helper creates an object\n\t// to represent this external process.\n\tdateCmd := exec.Command(\"date\")\n\n\t// The `Output` method runs the command, waits for it\n\t// to finish and collects its standard output.\n\t//  If there were no errors, `dateOut` will hold bytes\n\t// with the date info.\n\tdateOut, err := dateCmd.Output()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"> date\")\n\tfmt.Println(string(dateOut))\n\n\t// `Output` and other methods of `Command` will return\n\t// `*exec.Error` if there was a problem executing the\n\t// command (e.g. wrong path), and `*exec.ExitError`\n\t// if the command ran but exited with a non-zero return\n\t// code.\n\t_, err = exec.Command(\"date\", \"-x\").Output()\n\tif err != nil {\n\t\tif e, ok := errors.AsType[*exec.Error](err); ok {\n\t\t\tfmt.Println(\"failed executing:\", e)\n\t\t} else if e, ok := errors.AsType[*exec.ExitError](err); ok {\n\t\t\texitCode := e.ExitCode()\n\t\t\tfmt.Println(\"command exit rc =\", exitCode)\n\t\t} else {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\t// Next we'll look at a slightly more involved case\n\t// where we pipe data to the external process on its\n\t// `stdin` and collect the results from its `stdout`.\n\tgrepCmd := exec.Command(\"grep\", \"hello\")\n\n\t// Here we explicitly grab input/output pipes, start\n\t// the process, write some input to it, read the\n\t// resulting output, and finally wait for the process\n\t// to exit.\n\tgrepIn, _ := grepCmd.StdinPipe()\n\tgrepOut, _ := grepCmd.StdoutPipe()\n\tgrepCmd.Start()\n\tgrepIn.Write([]byte(\"hello grep\\ngoodbye grep\"))\n\tgrepIn.Close()\n\tgrepBytes, _ := io.ReadAll(grepOut)\n\tgrepCmd.Wait()\n\n\t// We omitted error checks in the above example, but\n\t// you could use the usual `if err != nil` pattern for\n\t// all of them. We also only collect the `StdoutPipe`\n\t// results, but you could collect the `StderrPipe` in\n\t// exactly the same way.\n\tfmt.Println(\"> grep hello\")\n\tfmt.Println(string(grepBytes))\n\n\t// Note that when spawning commands we need to\n\t// provide an explicitly delineated command and\n\t// argument array, vs. being able to just pass in one\n\t// command-line string. If you want to spawn a full\n\t// command with a string, you can use `bash`'s `-c`\n\t// option:\n\tlsCmd := exec.Command(\"bash\", \"-c\", \"ls -a -l -h\")\n\tlsOut, err := lsCmd.Output()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"> ls -a -l -h\")\n\tfmt.Println(string(lsOut))\n}\n"
  },
  {
    "path": "examples/spawning-processes/spawning-processes.hash",
    "content": "4eebcdac2df1c55c6264fe4422a8e6855bcbc2e6\nIxGAEXe0I7U\n"
  },
  {
    "path": "examples/spawning-processes/spawning-processes.sh",
    "content": "# The spawned programs return output that is the same\n# as if we had run them directly from the command-line.\n$ go run spawning-processes.go \n> date\nThu 05 May 2022 10:10:12 PM PDT\n\n# date doesn't have a `-x` flag so it will exit with\n# an error message and non-zero return code.\ncommand exit rc = 1\n> grep hello\nhello grep\n\n> ls -a -l -h\ndrwxr-xr-x  4 mark 136B Oct 3 16:29 .\ndrwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..\n-rw-r--r--  1 mark 1.3K Oct 3 16:28 spawning-processes.go\n"
  },
  {
    "path": "examples/stateful-goroutines/stateful-goroutines.go",
    "content": "// In the previous example we used explicit locking with\n// [mutexes](mutexes) to synchronize access to shared state\n// across multiple goroutines. Another option is to use the\n// built-in synchronization features of  goroutines and\n// channels to achieve the same result. This channel-based\n// approach aligns with Go's ideas of sharing memory by\n// communicating and having each piece of data owned\n// by exactly one goroutine.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\n// In this example our state will be owned by a single\n// goroutine. This will guarantee that the data is never\n// corrupted with concurrent access. In order to read or\n// write that state, other goroutines will send messages\n// to the owning goroutine and receive corresponding\n// replies. These `readOp` and `writeOp` `struct`s\n// encapsulate those requests and a way for the owning\n// goroutine to respond.\ntype readOp struct {\n\tkey  int\n\tresp chan int\n}\ntype writeOp struct {\n\tkey  int\n\tval  int\n\tresp chan bool\n}\n\nfunc main() {\n\n\t// As before we'll count how many operations we perform.\n\tvar readOps uint64\n\tvar writeOps uint64\n\n\t// The `reads` and `writes` channels will be used by\n\t// other goroutines to issue read and write requests,\n\t// respectively.\n\treads := make(chan readOp)\n\twrites := make(chan writeOp)\n\n\t// Here is the goroutine that owns the `state`, which\n\t// is a map as in the previous example but now private\n\t// to the stateful goroutine. This goroutine repeatedly\n\t// selects on the `reads` and `writes` channels,\n\t// responding to requests as they arrive. A response\n\t// is executed by first performing the requested\n\t// operation and then sending a value on the response\n\t// channel `resp` to indicate success (and the desired\n\t// value in the case of `reads`).\n\tgo func() {\n\t\tvar state = make(map[int]int)\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase read := <-reads:\n\t\t\t\tread.resp <- state[read.key]\n\t\t\tcase write := <-writes:\n\t\t\t\tstate[write.key] = write.val\n\t\t\t\twrite.resp <- true\n\t\t\t}\n\t\t}\n\t}()\n\n\t// This starts 100 goroutines to issue reads to the\n\t// state-owning goroutine via the `reads` channel.\n\t// Each read requires constructing a `readOp`, sending\n\t// it over the `reads` channel, and then receiving the\n\t// result over the provided `resp` channel.\n\tfor range 100 {\n\t\tgo func() {\n\t\t\tfor {\n\t\t\t\tread := readOp{\n\t\t\t\t\tkey:  rand.Intn(5),\n\t\t\t\t\tresp: make(chan int)}\n\t\t\t\treads <- read\n\t\t\t\t<-read.resp\n\t\t\t\tatomic.AddUint64(&readOps, 1)\n\t\t\t\ttime.Sleep(time.Millisecond)\n\t\t\t}\n\t\t}()\n\t}\n\n\t// We start 10 writes as well, using a similar\n\t// approach.\n\tfor range 10 {\n\t\tgo func() {\n\t\t\tfor {\n\t\t\t\twrite := writeOp{\n\t\t\t\t\tkey:  rand.Intn(5),\n\t\t\t\t\tval:  rand.Intn(100),\n\t\t\t\t\tresp: make(chan bool)}\n\t\t\t\twrites <- write\n\t\t\t\t<-write.resp\n\t\t\t\tatomic.AddUint64(&writeOps, 1)\n\t\t\t\ttime.Sleep(time.Millisecond)\n\t\t\t}\n\t\t}()\n\t}\n\n\t// Let the goroutines work for a second.\n\ttime.Sleep(time.Second)\n\n\t// Finally, capture and report the op counts.\n\treadOpsFinal := atomic.LoadUint64(&readOps)\n\tfmt.Println(\"readOps:\", readOpsFinal)\n\twriteOpsFinal := atomic.LoadUint64(&writeOps)\n\tfmt.Println(\"writeOps:\", writeOpsFinal)\n}\n"
  },
  {
    "path": "examples/stateful-goroutines/stateful-goroutines.hash",
    "content": "0436907e3df175590da08a697c204bc79054798f\nuwnybdsnOSa\n"
  },
  {
    "path": "examples/stateful-goroutines/stateful-goroutines.sh",
    "content": "# Running our program shows that the goroutine-based\n# state management example completes about 80,000\n# total operations.\n$ go run stateful-goroutines.go\nreadOps: 71708\nwriteOps: 7177\n\n# For this particular case the goroutine-based approach\n# was a bit more involved than the mutex-based one. It\n# might be useful in certain cases though, for example\n# where you have other channels involved or when managing\n# multiple such mutexes would be error-prone. You should\n# use whichever approach feels most natural, especially\n# with respect to understanding the correctness of your\n# program.\n"
  },
  {
    "path": "examples/string-formatting/string-formatting.go",
    "content": "// Go offers excellent support for string formatting in\n// the `printf` tradition. Here are some examples of\n// common string formatting tasks.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\ntype point struct {\n\tx, y int\n}\n\nfunc main() {\n\n\t// Go offers several printing \"verbs\" designed to\n\t// format general Go values. For example, this prints\n\t// an instance of our `point` struct.\n\tp := point{1, 2}\n\tfmt.Printf(\"struct1: %v\\n\", p)\n\n\t// If the value is a struct, the `%+v` variant will\n\t// include the struct's field names.\n\tfmt.Printf(\"struct2: %+v\\n\", p)\n\n\t// The `%#v` variant prints a Go syntax representation\n\t// of the value, i.e. the source code snippet that\n\t// would produce that value.\n\tfmt.Printf(\"struct3: %#v\\n\", p)\n\n\t// To print the type of a value, use `%T`.\n\tfmt.Printf(\"type: %T\\n\", p)\n\n\t// Formatting booleans is straight-forward.\n\tfmt.Printf(\"bool: %t\\n\", true)\n\n\t// There are many options for formatting integers.\n\t// Use `%d` for standard, base-10 formatting.\n\tfmt.Printf(\"int: %d\\n\", 123)\n\n\t// This prints a binary representation.\n\tfmt.Printf(\"bin: %b\\n\", 14)\n\n\t// This prints the character corresponding to the\n\t// given integer.\n\tfmt.Printf(\"char: %c\\n\", 33)\n\n\t// `%x` provides hex encoding.\n\tfmt.Printf(\"hex: %x\\n\", 456)\n\n\t// There are also several formatting options for\n\t// floats. For basic decimal formatting use `%f`.\n\tfmt.Printf(\"float1: %f\\n\", 78.9)\n\n\t// `%e` and `%E` format the float in (slightly\n\t// different versions of) scientific notation.\n\tfmt.Printf(\"float2: %e\\n\", 123400000.0)\n\tfmt.Printf(\"float3: %E\\n\", 123400000.0)\n\n\t// For basic string printing use `%s`.\n\tfmt.Printf(\"str1: %s\\n\", \"\\\"string\\\"\")\n\n\t// To double-quote strings as in Go source, use `%q`.\n\tfmt.Printf(\"str2: %q\\n\", \"\\\"string\\\"\")\n\n\t// As with integers seen earlier, `%x` renders\n\t// the string in base-16, with two output characters\n\t// per byte of input.\n\tfmt.Printf(\"str3: %x\\n\", \"hex this\")\n\n\t// To print a representation of a pointer, use `%p`.\n\tfmt.Printf(\"pointer: %p\\n\", &p)\n\n\t// When formatting numbers you will often want to\n\t// control the width and precision of the resulting\n\t// figure. To specify the width of an integer, use a\n\t// number after the `%` in the verb. By default the\n\t// result will be right-justified and padded with\n\t// spaces.\n\tfmt.Printf(\"width1: |%6d|%6d|\\n\", 12, 345)\n\n\t// You can also specify the width of printed floats,\n\t// though usually you'll also want to restrict the\n\t// decimal precision at the same time with the\n\t// width.precision syntax.\n\tfmt.Printf(\"width2: |%6.2f|%6.2f|\\n\", 1.2, 3.45)\n\n\t// To left-justify, use the `-` flag.\n\tfmt.Printf(\"width3: |%-6.2f|%-6.2f|\\n\", 1.2, 3.45)\n\n\t// You may also want to control width when formatting\n\t// strings, especially to ensure that they align in\n\t// table-like output. For basic right-justified width.\n\tfmt.Printf(\"width4: |%6s|%6s|\\n\", \"foo\", \"b\")\n\n\t// To left-justify use the `-` flag as with numbers.\n\tfmt.Printf(\"width5: |%-6s|%-6s|\\n\", \"foo\", \"b\")\n\n\t// So far we've seen `Printf`, which prints the\n\t// formatted string to `os.Stdout`. `Sprintf` formats\n\t// and returns a string without printing it anywhere.\n\ts := fmt.Sprintf(\"sprintf: a %s\", \"string\")\n\tfmt.Println(s)\n\n\t// You can format+print to `io.Writers` other than\n\t// `os.Stdout` using `Fprintf`.\n\tfmt.Fprintf(os.Stderr, \"io: an %s\\n\", \"error\")\n}\n"
  },
  {
    "path": "examples/string-formatting/string-formatting.hash",
    "content": "2297335ea52cc0ed960153b891d35252636308b4\nEZCZX1Uwp6D\n"
  },
  {
    "path": "examples/string-formatting/string-formatting.sh",
    "content": "$ go run string-formatting.go\nstruct1: {1 2}\nstruct2: {x:1 y:2}\nstruct3: main.point{x:1, y:2}\ntype: main.point\nbool: true\nint: 123\nbin: 1110\nchar: !\nhex: 1c8\nfloat1: 78.900000\nfloat2: 1.234000e+08\nfloat3: 1.234000E+08\nstr1: \"string\"\nstr2: \"\\\"string\\\"\"\nstr3: 6865782074686973\npointer: 0xc0000ba000\nwidth1: |    12|   345|\nwidth2: |  1.20|  3.45|\nwidth3: |1.20  |3.45  |\nwidth4: |   foo|     b|\nwidth5: |foo   |b     |\nsprintf: a string\nio: an error\n"
  },
  {
    "path": "examples/string-functions/string-functions.go",
    "content": "// The standard library's `strings` package provides many\n// useful string-related functions. Here are some examples\n// to give you a sense of the package.\n\npackage main\n\nimport (\n\t\"fmt\"\n\ts \"strings\"\n)\n\n// We alias `fmt.Println` to a shorter name as we'll use\n// it a lot below.\nvar p = fmt.Println\n\nfunc main() {\n\n\t// Here's a sample of the functions available in\n\t// `strings`. Since these are functions from the\n\t// package, not methods on the string object itself,\n\t// we need to pass the string in question as the first\n\t// argument to the function. You can find more\n\t// functions in the [`strings`](https://pkg.go.dev/strings)\n\t// package docs.\n\tp(\"Contains:  \", s.Contains(\"test\", \"es\"))\n\tp(\"Count:     \", s.Count(\"test\", \"t\"))\n\tp(\"HasPrefix: \", s.HasPrefix(\"test\", \"te\"))\n\tp(\"HasSuffix: \", s.HasSuffix(\"test\", \"st\"))\n\tp(\"Index:     \", s.Index(\"test\", \"e\"))\n\tp(\"Join:      \", s.Join([]string{\"a\", \"b\"}, \"-\"))\n\tp(\"Repeat:    \", s.Repeat(\"a\", 5))\n\tp(\"Replace:   \", s.Replace(\"foo\", \"o\", \"0\", -1))\n\tp(\"Replace:   \", s.Replace(\"foo\", \"o\", \"0\", 1))\n\tp(\"Split:     \", s.Split(\"a-b-c-d-e\", \"-\"))\n\tp(\"ToLower:   \", s.ToLower(\"TEST\"))\n\tp(\"ToUpper:   \", s.ToUpper(\"test\"))\n}\n"
  },
  {
    "path": "examples/string-functions/string-functions.hash",
    "content": "e1e2ea01b9c79fecebfece602915e9367b02a083\nwKSAzxfs96O\n"
  },
  {
    "path": "examples/string-functions/string-functions.sh",
    "content": "$ go run string-functions.go\nContains:   true\nCount:      2\nHasPrefix:  true\nHasSuffix:  true\nIndex:      1\nJoin:       a-b\nRepeat:     aaaaa\nReplace:    f00\nReplace:    f0o\nSplit:      [a b c d e]\nToLower:    test\nToUpper:    TEST\n"
  },
  {
    "path": "examples/strings-and-runes/strings-and-runes.go",
    "content": "// A Go string is a read-only slice of bytes. The language\n// and the standard library treat strings specially - as\n// containers of text encoded in [UTF-8](https://en.wikipedia.org/wiki/UTF-8).\n// In other languages, strings are made of \"characters\".\n// In Go, the concept of a character is called a `rune` - it's\n// an integer that represents a Unicode code point.\n// [This Go blog post](https://go.dev/blog/strings) is a good\n// introduction to the topic.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"unicode/utf8\"\n)\n\nfunc main() {\n\n\t// `s` is a `string` assigned a literal value\n\t// representing the word \"hello\" in the Thai\n\t// language. Go string literals are UTF-8\n\t// encoded text.\n\tconst s = \"สวัสดี\"\n\n\t// Since strings are equivalent to `[]byte`, this\n\t// will produce the length of the raw bytes stored within.\n\tfmt.Println(\"Len:\", len(s))\n\n\t// Indexing into a string produces the raw byte values at\n\t// each index. This loop generates the hex values of all\n\t// the bytes that constitute the code points in `s`.\n\tfor i := 0; i < len(s); i++ {\n\t\tfmt.Printf(\"%x \", s[i])\n\t}\n\tfmt.Println()\n\n\t// To count how many _runes_ are in a string, we can use\n\t// the `utf8` package. Note that the run-time of\n\t// `RuneCountInString` depends on the size of the string,\n\t// because it has to decode each UTF-8 rune sequentially.\n\t// Some Thai characters are represented by UTF-8 code points\n\t// that can span multiple bytes, so the result of this count\n\t// may be surprising.\n\tfmt.Println(\"Rune count:\", utf8.RuneCountInString(s))\n\n\t// A `range` loop handles strings specially and decodes\n\t// each `rune` along with its offset in the string.\n\tfor idx, runeValue := range s {\n\t\tfmt.Printf(\"%#U starts at %d\\n\", runeValue, idx)\n\t}\n\n\t// We can achieve the same iteration by using the\n\t// `utf8.DecodeRuneInString` function explicitly.\n\tfmt.Println(\"\\nUsing DecodeRuneInString\")\n\tfor i, w := 0, 0; i < len(s); i += w {\n\t\truneValue, width := utf8.DecodeRuneInString(s[i:])\n\t\tfmt.Printf(\"%#U starts at %d\\n\", runeValue, i)\n\t\tw = width\n\n\t\t// This demonstrates passing a `rune` value to a function.\n\t\texamineRune(runeValue)\n\t}\n}\n\nfunc examineRune(r rune) {\n\n\t// Values enclosed in single quotes are _rune literals_. We\n\t// can compare a `rune` value to a rune literal directly.\n\tif r == 't' {\n\t\tfmt.Println(\"found tee\")\n\t} else if r == 'ส' {\n\t\tfmt.Println(\"found so sua\")\n\t}\n}\n"
  },
  {
    "path": "examples/strings-and-runes/strings-and-runes.hash",
    "content": "ffbc918567cea7cdadcaee87ffc404a1d4f5c62a\n-iNDXZ9IM3s\n"
  },
  {
    "path": "examples/strings-and-runes/strings-and-runes.sh",
    "content": "$ go run strings-and-runes.go\nLen: 18\ne0 b8 aa e0 b8 a7 e0 b8 b1 e0 b8 aa e0 b8 94 e0 b8 b5 \nRune count: 6\nU+0E2A 'ส' starts at 0\nU+0E27 'ว' starts at 3\nU+0E31 'ั' starts at 6\nU+0E2A 'ส' starts at 9\nU+0E14 'ด' starts at 12\nU+0E35 'ี' starts at 15\n\nUsing DecodeRuneInString\nU+0E2A 'ส' starts at 0\nfound so sua\nU+0E27 'ว' starts at 3\nU+0E31 'ั' starts at 6\nU+0E2A 'ส' starts at 9\nfound so sua\nU+0E14 'ด' starts at 12\nU+0E35 'ี' starts at 15\n"
  },
  {
    "path": "examples/struct-embedding/struct-embedding.go",
    "content": "// Go supports _embedding_ of structs and interfaces\n// to express a more seamless _composition_ of types.\n// This is not to be confused with [`//go:embed`](embed-directive) which is\n// a go directive introduced in Go version 1.16+ to embed\n// files and folders into the application binary.\n\npackage main\n\nimport \"fmt\"\n\ntype base struct {\n\tnum int\n}\n\nfunc (b base) describe() string {\n\treturn fmt.Sprintf(\"base with num=%v\", b.num)\n}\n\n// A `container` _embeds_ a `base`. An embedding looks\n// like a field without a name.\ntype container struct {\n\tbase\n\tstr string\n}\n\nfunc main() {\n\n\t// When creating structs with literals, we have to\n\t// initialize the embedding explicitly; here the\n\t// embedded type serves as the field name.\n\tco := container{\n\t\tbase: base{\n\t\t\tnum: 1,\n\t\t},\n\t\tstr: \"some name\",\n\t}\n\n\t// We can access the base's fields directly on `co`,\n\t// e.g. `co.num`.\n\tfmt.Printf(\"co={num: %v, str: %v}\\n\", co.num, co.str)\n\n\t// Alternatively, we can spell out the full path using\n\t// the embedded type name.\n\tfmt.Println(\"also num:\", co.base.num)\n\n\t// Since `container` embeds `base`, the methods of\n\t// `base` also become methods of a `container`. Here\n\t// we invoke a method that was embedded from `base`\n\t// directly on `co`.\n\tfmt.Println(\"describe:\", co.describe())\n\n\ttype describer interface {\n\t\tdescribe() string\n\t}\n\n\t// Embedding structs with methods may be used to bestow\n\t// interface implementations onto other structs. Here\n\t// we see that a `container` now implements the\n\t// `describer` interface because it embeds `base`.\n\tvar d describer = co\n\tfmt.Println(\"describer:\", d.describe())\n}\n"
  },
  {
    "path": "examples/struct-embedding/struct-embedding.hash",
    "content": "7ac6d1889bfc68e8f3f931014c87e05db2ecda95\n-LOu1L0i2tR\n"
  },
  {
    "path": "examples/struct-embedding/struct-embedding.sh",
    "content": "$ go run struct-embedding.go\nco={num: 1, str: some name}\nalso num: 1\ndescribe: base with num=1\ndescriber: base with num=1\n"
  },
  {
    "path": "examples/structs/structs.go",
    "content": "// Go's _structs_ are typed collections of fields.\n// They're useful for grouping data together to form\n// records.\n\npackage main\n\nimport \"fmt\"\n\n// This `person` struct type has `name` and `age` fields.\ntype person struct {\n\tname string\n\tage  int\n}\n\n// `newPerson` constructs a new person struct with the given name.\nfunc newPerson(name string) *person {\n\t// Go is a garbage collected language; you can safely\n\t// return a pointer to a local variable - it will only\n\t// be cleaned up by the garbage collector when there\n\t// are no active references to it.\n\tp := person{name: name}\n\tp.age = 42\n\treturn &p\n}\n\nfunc main() {\n\n\t// This syntax creates a new struct.\n\tfmt.Println(person{\"Bob\", 20})\n\n\t// You can name the fields when initializing a struct.\n\tfmt.Println(person{name: \"Alice\", age: 30})\n\n\t// Omitted fields will be zero-valued.\n\tfmt.Println(person{name: \"Fred\"})\n\n\t// An `&` prefix yields a pointer to the struct.\n\tfmt.Println(&person{name: \"Ann\", age: 40})\n\n\t// It's idiomatic to encapsulate new struct creation in constructor functions\n\tfmt.Println(newPerson(\"Jon\"))\n\n\t// Access struct fields with a dot.\n\ts := person{name: \"Sean\", age: 50}\n\tfmt.Println(s.name)\n\n\t// You can also use dots with struct pointers - the\n\t// pointers are automatically dereferenced.\n\tsp := &s\n\tfmt.Println(sp.age)\n\n\t// Structs are mutable.\n\tsp.age = 51\n\tfmt.Println(sp.age)\n\n\t// If a struct type is only used for a single value, we don't\n\t// have to give it a name. The value can have an anonymous\n\t// struct type. This technique is commonly used for\n\t// [table-driven tests](testing-and-benchmarking).\n\tdog := struct {\n\t\tname   string\n\t\tisGood bool\n\t}{\n\t\t\"Rex\",\n\t\ttrue,\n\t}\n\tfmt.Println(dog)\n}\n"
  },
  {
    "path": "examples/structs/structs.hash",
    "content": "b50c1756bf9a2ea7f8853f7f7cb7a61d5efebfc3\n56SPo-L2nMN\n"
  },
  {
    "path": "examples/structs/structs.sh",
    "content": "$ go run structs.go\n{Bob 20}\n{Alice 30}\n{Fred 0}\n&{Ann 40}\n&{Jon 42}\nSean\n50\n51\n{Rex true}\n"
  },
  {
    "path": "examples/switch/switch.go",
    "content": "// _Switch statements_ express conditionals across many\n// branches.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// Here's a basic `switch`.\n\ti := 2\n\tfmt.Print(\"Write \", i, \" as \")\n\tswitch i {\n\tcase 1:\n\t\tfmt.Println(\"one\")\n\tcase 2:\n\t\tfmt.Println(\"two\")\n\tcase 3:\n\t\tfmt.Println(\"three\")\n\t}\n\n\t// You can use commas to separate multiple expressions\n\t// in the same `case` statement. We use the optional\n\t// `default` case in this example as well.\n\tswitch time.Now().Weekday() {\n\tcase time.Saturday, time.Sunday:\n\t\tfmt.Println(\"It's the weekend\")\n\tdefault:\n\t\tfmt.Println(\"It's a weekday\")\n\t}\n\n\t// `switch` without an expression is an alternate way\n\t// to express if/else logic. Here we also show how the\n\t// `case` expressions can be non-constants.\n\tt := time.Now()\n\tswitch {\n\tcase t.Hour() < 12:\n\t\tfmt.Println(\"It's before noon\")\n\tdefault:\n\t\tfmt.Println(\"It's after noon\")\n\t}\n\n\t// A type `switch` compares types instead of values.  You\n\t// can use this to discover the type of an interface\n\t// value.  In this example, the variable `t` will have the\n\t// type corresponding to its clause.\n\twhatAmI := func(i interface{}) {\n\t\tswitch t := i.(type) {\n\t\tcase bool:\n\t\t\tfmt.Println(\"I'm a bool\")\n\t\tcase int:\n\t\t\tfmt.Println(\"I'm an int\")\n\t\tdefault:\n\t\t\tfmt.Printf(\"Don't know type %T\\n\", t)\n\t\t}\n\t}\n\twhatAmI(true)\n\twhatAmI(1)\n\twhatAmI(\"hey\")\n}\n"
  },
  {
    "path": "examples/switch/switch.hash",
    "content": "28a8909ee7963cb315f14a3be1607def1d91f3a3\nqVDqWoUQ6AI\n"
  },
  {
    "path": "examples/switch/switch.sh",
    "content": "$ go run switch.go \nWrite 2 as two\nIt's a weekday\nIt's after noon\nI'm a bool\nI'm an int\nDon't know type string\n"
  },
  {
    "path": "examples/tcp-server/tcp-server.go",
    "content": "// The `net` package provides the tools we need to easily build\n// TCP socket servers.\npackage main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"strings\"\n)\n\nfunc main() {\n\n\t// `net.Listen` starts the server on the given network\n\t// (TCP) and address (port 8090 on all interfaces).\n\tlistener, err := net.Listen(\"tcp\", \":8090\")\n\tif err != nil {\n\t\tlog.Fatal(\"Error listening:\", err)\n\t}\n\n\t// Close the listener to free the port\n\t// when the application exits.\n\tdefer listener.Close()\n\n\t// Loop indefinitely to accept new client connections.\n\tfor {\n\t\t// Wait for a connection.\n\t\tconn, err := listener.Accept()\n\t\tif err != nil {\n\t\t\tlog.Println(\"Error accepting conn:\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// We use a goroutine here to handle the connection\n\t\t// so that the main loop can continue accepting more\n\t\t// connections.\n\t\tgo handleConnection(conn)\n\t}\n}\n\n// `handleConnection` handles a single client connection,\n// reading one line of text from the client and returning a response.\nfunc handleConnection(conn net.Conn) {\n\t// Closing the connection releases resources when\n\t// we are finished interacting with the client.\n\tdefer conn.Close()\n\n\t// Use `bufio.NewReader` to read one line of data\n\t// from the client (terminated by a newline).\n\treader := bufio.NewReader(conn)\n\tmessage, err := reader.ReadString('\\n')\n\tif err != nil {\n\t\tlog.Printf(\"Read error: %v\", err)\n\t\treturn\n\t}\n\n\t// Create and send a response back to the client,\n\t// demonstrating two-way communication.\n\tackMsg := strings.ToUpper(strings.TrimSpace(message))\n\tresponse := fmt.Sprintf(\"ACK: %s\\n\", ackMsg)\n\t_, err = conn.Write([]byte(response))\n\tif err != nil {\n\t\tlog.Printf(\"Server write error: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "examples/tcp-server/tcp-server.hash",
    "content": "c356ece464b228046dc123501acc746ae63d58a8\nG0k2jHMA6ei\n"
  },
  {
    "path": "examples/tcp-server/tcp-server.sh",
    "content": "# Run the TCP server in the background.\n$ go run tcp-server.go &\n\n# Send data and capture the response using netcat.\n$ echo \"Hello from netcat\" | nc localhost 8090\nACK: HELLO FROM NETCAT\n\n"
  },
  {
    "path": "examples/temporary-files-and-directories/temporary-files-and-directories.go",
    "content": "// Throughout program execution, we often want to create\n// data that isn't needed after the program exits.\n// *Temporary files and directories* are useful for this\n// purpose since they don't pollute the file system over\n// time.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc check(e error) {\n\tif e != nil {\n\t\tpanic(e)\n\t}\n}\n\nfunc main() {\n\n\t// The easiest way to create a temporary file is by\n\t// calling `os.CreateTemp`. It creates a file *and*\n\t// opens it for reading and writing. We provide `\"\"`\n\t// as the first argument, so `os.CreateTemp` will\n\t// create the file in the default location for our OS.\n\tf, err := os.CreateTemp(\"\", \"sample\")\n\tcheck(err)\n\n\t// Display the name of the temporary file. On\n\t// Unix-based OSes the directory will likely be `/tmp`.\n\t// The file name starts with the prefix given as the\n\t// second argument to `os.CreateTemp` and the rest\n\t// is chosen automatically to ensure that concurrent\n\t// calls will always create different file names.\n\tfmt.Println(\"Temp file name:\", f.Name())\n\n\t// Clean up the file after we're done. The OS is\n\t// likely to clean up temporary files by itself after\n\t// some time, but it's good practice to do this\n\t// explicitly.\n\tdefer os.Remove(f.Name())\n\n\t// We can write some data to the file.\n\t_, err = f.Write([]byte{1, 2, 3, 4})\n\tcheck(err)\n\n\t// If we intend to write many temporary files, we may\n\t// prefer to create a temporary *directory*.\n\t// `os.MkdirTemp`'s arguments are the same as\n\t// `CreateTemp`'s, but it returns a directory *name*\n\t// rather than an open file.\n\tdname, err := os.MkdirTemp(\"\", \"sampledir\")\n\tcheck(err)\n\tfmt.Println(\"Temp dir name:\", dname)\n\n\tdefer os.RemoveAll(dname)\n\n\t// Now we can synthesize temporary file names by\n\t// prefixing them with our temporary directory.\n\tfname := filepath.Join(dname, \"file1\")\n\terr = os.WriteFile(fname, []byte{1, 2}, 0666)\n\tcheck(err)\n}\n"
  },
  {
    "path": "examples/temporary-files-and-directories/temporary-files-and-directories.hash",
    "content": "d875fd8f061e895d72c48c360a8ad4b04e406dd4\nhVcPg9RH3_V\n"
  },
  {
    "path": "examples/temporary-files-and-directories/temporary-files-and-directories.sh",
    "content": "$ go run temporary-files-and-directories.go\nTemp file name: /tmp/sample610887201\nTemp dir name: /tmp/sampledir898854668\n"
  },
  {
    "path": "examples/testing-and-benchmarking/main_test.go",
    "content": "// Unit testing is an important part of writing\n// principled Go programs. The `testing` package\n// provides the tools we need to write unit tests\n// and the `go test` command runs tests.\n\n// For the sake of demonstration, this code is in package\n// `main`, but it could be any package. Testing code\n// typically lives in the same package as the code it tests.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\n// We'll be testing this simple implementation of an\n// integer minimum. Typically, the code we're testing\n// would be in a source file named something like\n// `intutils.go`, and the test file for it would then\n// be named `intutils_test.go`.\nfunc IntMin(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\n// A test is created by writing a function with a name\n// beginning with `Test`.\nfunc TestIntMinBasic(t *testing.T) {\n\tans := IntMin(2, -2)\n\tif ans != -2 {\n\t\t// `t.Error*` will report test failures but continue\n\t\t// executing the test. `t.Fatal*` will report test\n\t\t// failures and stop the test immediately.\n\t\tt.Errorf(\"IntMin(2, -2) = %d; want -2\", ans)\n\t}\n}\n\n// Writing tests can be repetitive, so it's idiomatic to\n// use a *table-driven style*, where test inputs and\n// expected outputs are listed in a table and a single loop\n// walks over them and performs the test logic.\nfunc TestIntMinTableDriven(t *testing.T) {\n\tvar tests = []struct {\n\t\ta, b int\n\t\twant int\n\t}{\n\t\t{0, 1, 0},\n\t\t{1, 0, 0},\n\t\t{2, -2, -2},\n\t\t{0, -1, -1},\n\t\t{-1, 0, -1},\n\t}\n\n\tfor _, tt := range tests {\n\t\t// `t.Run` enables running \"subtests\", one for each\n\t\t// table entry. These are shown separately\n\t\t// when executing `go test -v`.\n\t\ttestname := fmt.Sprintf(\"%d,%d\", tt.a, tt.b)\n\t\tt.Run(testname, func(t *testing.T) {\n\t\t\tans := IntMin(tt.a, tt.b)\n\t\t\tif ans != tt.want {\n\t\t\t\tt.Errorf(\"got %d, want %d\", ans, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Benchmark tests typically go in `_test.go` files and are\n// named beginning with `Benchmark`.\n// Any code that's required for the benchmark to run but should\n// not be measured goes before this loop.\nfunc BenchmarkIntMin(b *testing.B) {\n\tfor b.Loop() {\n\t\t// The benchmark runner will automatically execute this loop\n\t\t// body many times to determine a reasonable estimate of the\n\t\t// run-time of a single iteration.\n\t\tIntMin(1, 2)\n\t}\n}\n"
  },
  {
    "path": "examples/testing-and-benchmarking/main_test.sh",
    "content": "# Run all tests in the current project in verbose mode.\n$ go test -v\n== RUN   TestIntMinBasic\n--- PASS: TestIntMinBasic (0.00s)\n=== RUN   TestIntMinTableDriven\n=== RUN   TestIntMinTableDriven/0,1\n=== RUN   TestIntMinTableDriven/1,0\n=== RUN   TestIntMinTableDriven/2,-2\n=== RUN   TestIntMinTableDriven/0,-1\n=== RUN   TestIntMinTableDriven/-1,0\n--- PASS: TestIntMinTableDriven (0.00s)\n    --- PASS: TestIntMinTableDriven/0,1 (0.00s)\n    --- PASS: TestIntMinTableDriven/1,0 (0.00s)\n    --- PASS: TestIntMinTableDriven/2,-2 (0.00s)\n    --- PASS: TestIntMinTableDriven/0,-1 (0.00s)\n    --- PASS: TestIntMinTableDriven/-1,0 (0.00s)\nPASS\nok  \texamples/testing-and-benchmarking\t0.023s\n\n# Run all benchmarks in the current project. All tests\n# are run prior to benchmarks. The `bench` flag filters\n# benchmark function names with a regexp.\n$ go test -bench=.\ngoos: darwin\ngoarch: arm64\npkg: examples/testing\nBenchmarkIntMin-8 1000000000 0.3136 ns/op\nPASS\nok  \texamples/testing-and-benchmarking\t0.351s\n"
  },
  {
    "path": "examples/testing-and-benchmarking/testing-and-benchmarking.hash",
    "content": "565e50f23b399cdbca4aedeb8b62b9f6ad097443\nosZckbKSkse\n"
  },
  {
    "path": "examples/text-templates/text-templates.go",
    "content": "// Go offers built-in support for creating dynamic content or showing customized\n// output to the user with the `text/template` package. A sibling package\n// named `html/template` provides the same API but has additional security\n// features and should be used for generating HTML.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"text/template\"\n)\n\nfunc main() {\n\n\t// We can create a new template and parse its body from\n\t// a string.\n\t// Templates are a mix of static text and \"actions\" enclosed in\n\t// `{{...}}` that are used to dynamically insert content.\n\tt1 := template.New(\"t1\")\n\tt1, err := t1.Parse(\"Value is {{.}}\\n\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Alternatively, we can use the `template.Must` function to\n\t// panic in case `Parse` returns an error. This is especially\n\t// useful for templates initialized in the global scope.\n\tt1 = template.Must(t1.Parse(\"Value: {{.}}\\n\"))\n\n\t// By \"executing\" the template we generate its text with\n\t// specific values for its actions. The `{{.}}` action is\n\t// replaced by the value passed as a parameter to `Execute`.\n\tt1.Execute(os.Stdout, \"some text\")\n\tt1.Execute(os.Stdout, 5)\n\tt1.Execute(os.Stdout, []string{\n\t\t\"Go\",\n\t\t\"Rust\",\n\t\t\"C++\",\n\t\t\"C#\",\n\t})\n\n\t// Helper function we'll use below.\n\tCreate := func(name, t string) *template.Template {\n\t\treturn template.Must(template.New(name).Parse(t))\n\t}\n\n\t// If the data is a struct we can use the `{{.FieldName}}` action to access\n\t// its fields. The fields should be exported to be accessible when a\n\t// template is executing.\n\tt2 := Create(\"t2\", \"Name: {{.Name}}\\n\")\n\n\tt2.Execute(os.Stdout, struct {\n\t\tName string\n\t}{\"Jane Doe\"})\n\n\t// The same applies to maps; with maps there is no restriction on the\n\t// case of key names.\n\tt2.Execute(os.Stdout, map[string]string{\n\t\t\"Name\": \"Mickey Mouse\",\n\t})\n\n\t// if/else provide conditional execution for templates. A value is considered\n\t// false if it's the default value of a type, such as 0, an empty string,\n\t// nil pointer, etc.\n\t// This sample demonstrates another\n\t// feature of templates: using `-` in actions to trim whitespace.\n\tt3 := Create(\"t3\",\n\t\t\"{{if . -}} yes {{else -}} no {{end}}\\n\")\n\tt3.Execute(os.Stdout, \"not empty\")\n\tt3.Execute(os.Stdout, \"\")\n\n\t// range blocks let us loop through slices, arrays, maps or channels. Inside\n\t// the range block `{{.}}` is set to the current item of the iteration.\n\tt4 := Create(\"t4\",\n\t\t\"Range: {{range .}}{{.}} {{end}}\\n\")\n\tt4.Execute(os.Stdout,\n\t\t[]string{\n\t\t\t\"Go\",\n\t\t\t\"Rust\",\n\t\t\t\"C++\",\n\t\t\t\"C#\",\n\t\t})\n}\n"
  },
  {
    "path": "examples/text-templates/text-templates.hash",
    "content": "c29676a83f4832a77b7a9e300d3fb5fe315de7b8\npDwkw1iMACF\n"
  },
  {
    "path": "examples/text-templates/text-templates.sh",
    "content": "$ go run templates.go \nValue: some text\nValue: 5\nValue: [Go Rust C++ C#]\nName: Jane Doe\nName: Mickey Mouse\nyes \nno \nRange: Go Rust C++ C# \n"
  },
  {
    "path": "examples/tickers/tickers.go",
    "content": "// [Timers](timers) are for when you want to do\n// something once in the future - _tickers_ are for when\n// you want to do something repeatedly at regular\n// intervals. Here's an example of a ticker that ticks\n// periodically until we stop it.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// Tickers use a similar mechanism to timers: a\n\t// channel that is sent values. Here we'll use the\n\t// `select` builtin on the channel to await the\n\t// values as they arrive every 500ms.\n\tticker := time.NewTicker(500 * time.Millisecond)\n\tdone := make(chan bool)\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-done:\n\t\t\t\treturn\n\t\t\tcase t := <-ticker.C:\n\t\t\t\tfmt.Println(\"Tick at\", t)\n\t\t\t}\n\t\t}\n\t}()\n\n\t// Tickers can be stopped like timers. Once a ticker\n\t// is stopped it won't receive any more values on its\n\t// channel. We'll stop ours after 1600ms.\n\ttime.Sleep(1600 * time.Millisecond)\n\tticker.Stop()\n\tdone <- true\n\tfmt.Println(\"Ticker stopped\")\n}\n"
  },
  {
    "path": "examples/tickers/tickers.hash",
    "content": "432b3be0884cead3f01b9cce0868ac6146e7864e\ngs6zoJP-Pl9\n"
  },
  {
    "path": "examples/tickers/tickers.sh",
    "content": "# When we run this program the ticker should tick 3 times\n# before we stop it.\n$ go run tickers.go\nTick at 2012-09-23 11:29:56.487625 -0700 PDT\nTick at 2012-09-23 11:29:56.988063 -0700 PDT\nTick at 2012-09-23 11:29:57.488076 -0700 PDT\nTicker stopped\n"
  },
  {
    "path": "examples/time/time.go",
    "content": "// Go offers extensive support for times and durations;\n// here are some examples.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\tp := fmt.Println\n\n\t// We'll start by getting the current time.\n\tnow := time.Now()\n\tp(now)\n\n\t// You can build a `time` struct by providing the\n\t// year, month, day, etc. Times are always associated\n\t// with a `Location`, i.e. time zone.\n\tthen := time.Date(\n\t\t2009, 11, 17, 20, 34, 58, 651387237, time.UTC)\n\tp(then)\n\n\t// You can extract the various components of the time\n\t// value as expected.\n\tp(then.Year())\n\tp(then.Month())\n\tp(then.Day())\n\tp(then.Hour())\n\tp(then.Minute())\n\tp(then.Second())\n\tp(then.Nanosecond())\n\tp(then.Location())\n\n\t// The Monday-Sunday `Weekday` is also available.\n\tp(then.Weekday())\n\n\t// These methods compare two times, testing if the\n\t// first occurs before, after, or at the same time\n\t// as the second, respectively.\n\tp(then.Before(now))\n\tp(then.After(now))\n\tp(then.Equal(now))\n\n\t// The `Sub` methods returns a `Duration` representing\n\t// the interval between two times.\n\tdiff := now.Sub(then)\n\tp(diff)\n\n\t// We can compute the length of the duration in\n\t// various units.\n\tp(diff.Hours())\n\tp(diff.Minutes())\n\tp(diff.Seconds())\n\tp(diff.Nanoseconds())\n\n\t// You can use `Add` to advance a time by a given\n\t// duration, or with a `-` to move backwards by a\n\t// duration.\n\tp(then.Add(diff))\n\tp(then.Add(-diff))\n}\n"
  },
  {
    "path": "examples/time/time.hash",
    "content": "24eefcc82ee0c70a4678a4952fe2b8c558c7419c\nYAM3s1KPc8c\n"
  },
  {
    "path": "examples/time/time.sh",
    "content": "$ go run time.go\n2012-10-31 15:50:13.793654 +0000 UTC\n2009-11-17 20:34:58.651387237 +0000 UTC\n2009\nNovember\n17\n20\n34\n58\n651387237\nUTC\nTuesday\ntrue\nfalse\nfalse\n25891h15m15.142266763s\n25891.25420618521\n1.5534752523711128e+06\n9.320851514226677e+07\n93208515142266763\n2012-10-31 15:50:13.793654 +0000 UTC\n2006-12-05 01:19:43.509120474 +0000 UTC\n\n# Next we'll look at the related idea of time relative to\n# the Unix epoch.\n"
  },
  {
    "path": "examples/time-formatting-parsing/time-formatting-parsing.go",
    "content": "// Go supports time formatting and parsing via\n// pattern-based layouts.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\tp := fmt.Println\n\n\t// Here's a basic example of formatting a time\n\t// according to RFC3339, using the corresponding layout\n\t// constant.\n\tt := time.Now()\n\tp(t.Format(time.RFC3339))\n\n\t// Time parsing uses the same layout values as `Format`.\n\tt1, _ := time.Parse(time.RFC3339, \"2012-11-01T22:08:41+00:00\")\n\tp(t1)\n\n\t// `Format` and `Parse` use example-based layouts. Usually\n\t// you'll use a constant from `time` for these layouts, but\n\t// you can also supply custom layouts. Layouts must use the\n\t// reference time `Mon Jan 2 15:04:05 MST 2006` to show the\n\t// pattern with which to format/parse a given time/string.\n\t// The example time must be exactly as shown: the year 2006,\n\t// 15 for the hour, Monday for the day of the week, etc.\n\tp(t.Format(\"3:04PM\"))\n\tp(t.Format(\"Mon Jan _2 15:04:05 2006\"))\n\tp(t.Format(\"2006-01-02T15:04:05.999999-07:00\"))\n\tform := \"3 04 PM\"\n\tt2, _ := time.Parse(form, \"8 41 PM\")\n\tp(t2)\n\n\t// For purely numeric representations you can also\n\t// use standard string formatting with the extracted\n\t// components of the time value.\n\tfmt.Printf(\"%d-%02d-%02dT%02d:%02d:%02d-00:00\\n\",\n\t\tt.Year(), t.Month(), t.Day(),\n\t\tt.Hour(), t.Minute(), t.Second())\n\n\t// `Parse` will return an error on malformed input\n\t// explaining the parsing problem.\n\t_, err := time.Parse(\"Mon Jan _2 15:04:05 2006\", \"8:41PM\")\n\tp(err)\n}\n"
  },
  {
    "path": "examples/time-formatting-parsing/time-formatting-parsing.hash",
    "content": "beec3e9eba00fffd88fd1f8b09fa9b38ed76974d\n0dgIUsTgEYs\n"
  },
  {
    "path": "examples/time-formatting-parsing/time-formatting-parsing.sh",
    "content": "$ go run time-formatting-parsing.go \n2014-04-15T18:00:15-07:00\n2012-11-01 22:08:41 +0000 +0000\n6:00PM\nTue Apr 15 18:00:15 2014\n2014-04-15T18:00:15.161182-07:00\n0000-01-01 20:41:00 +0000 UTC\n2014-04-15T18:00:15-00:00\nparsing time \"8:41PM\" as \"Mon Jan _2 15:04:05 2006\": ...\n"
  },
  {
    "path": "examples/timeouts/timeouts.go",
    "content": "// _Timeouts_ are important for programs that connect to\n// external resources or that otherwise need to bound\n// execution time. Implementing timeouts in Go is easy and\n// elegant thanks to channels and `select`.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// For our example, suppose we're executing an external\n\t// call that returns its result on a channel `c1`\n\t// after 2s. Note that the channel is buffered, so the\n\t// send in the goroutine is nonblocking. This is a\n\t// common pattern to prevent goroutine leaks in case the\n\t// channel is never read.\n\tc1 := make(chan string, 1)\n\tgo func() {\n\t\ttime.Sleep(2 * time.Second)\n\t\tc1 <- \"result 1\"\n\t}()\n\n\t// Here's the `select` implementing a timeout.\n\t// `res := <-c1` awaits the result and `<-time.After`\n\t// awaits a value to be sent after the timeout of\n\t// 1s. Since `select` proceeds with the first\n\t// receive that's ready, we'll take the timeout case\n\t// if the operation takes more than the allowed 1s.\n\tselect {\n\tcase res := <-c1:\n\t\tfmt.Println(res)\n\tcase <-time.After(1 * time.Second):\n\t\tfmt.Println(\"timeout 1\")\n\t}\n\n\t// If we allow a longer timeout of 3s, then the receive\n\t// from `c2` will succeed and we'll print the result.\n\tc2 := make(chan string, 1)\n\tgo func() {\n\t\ttime.Sleep(2 * time.Second)\n\t\tc2 <- \"result 2\"\n\t}()\n\tselect {\n\tcase res := <-c2:\n\t\tfmt.Println(res)\n\tcase <-time.After(3 * time.Second):\n\t\tfmt.Println(\"timeout 2\")\n\t}\n}\n"
  },
  {
    "path": "examples/timeouts/timeouts.hash",
    "content": "79963f30cb3ca93d559a409e3ded40c2bb64df66\ngyr0NbVKBVf\n"
  },
  {
    "path": "examples/timeouts/timeouts.sh",
    "content": "# Running this program shows the first operation timing\n# out and the second succeeding.\n$ go run timeouts.go \ntimeout 1\nresult 2\n"
  },
  {
    "path": "examples/timers/timers.go",
    "content": "// We often want to execute Go code at some point in the\n// future, or repeatedly at some interval. Go's built-in\n// _timer_ and _ticker_ features make both of these tasks\n// easy. We'll look first at timers and then\n// at [tickers](tickers).\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\n\t// Timers represent a single event in the future. You\n\t// tell the timer how long you want to wait, and it\n\t// provides a channel that will be notified at that\n\t// time. This timer will wait 2 seconds.\n\ttimer1 := time.NewTimer(2 * time.Second)\n\n\t// The `<-timer1.C` blocks on the timer's channel `C`\n\t// until it sends a value indicating that the timer\n\t// fired.\n\t<-timer1.C\n\tfmt.Println(\"Timer 1 fired\")\n\n\t// If you just wanted to wait, you could have used\n\t// `time.Sleep`. One reason a timer may be useful is\n\t// that you can cancel the timer before it fires.\n\t// Here's an example of that.\n\ttimer2 := time.NewTimer(time.Second)\n\tgo func() {\n\t\t<-timer2.C\n\t\tfmt.Println(\"Timer 2 fired\")\n\t}()\n\tstop2 := timer2.Stop()\n\tif stop2 {\n\t\tfmt.Println(\"Timer 2 stopped\")\n\t}\n\n\t// Give the `timer2` enough time to fire, if it ever\n\t// was going to, to show it is in fact stopped.\n\ttime.Sleep(2 * time.Second)\n}\n"
  },
  {
    "path": "examples/timers/timers.hash",
    "content": "36cae12a3ca529e473d7839e9573c3e0a202c2de\ngF7VLRz3URM\n"
  },
  {
    "path": "examples/timers/timers.sh",
    "content": "# The first timer will fire ~2s after we start the\n# program, but the second should be stopped before it has\n# a chance to fire.\n$ go run timers.go\nTimer 1 fired\nTimer 2 stopped\n"
  },
  {
    "path": "examples/url-parsing/url-parsing.go",
    "content": "// URLs provide a [uniform way to locate resources](https://adam.herokuapp.com/past/2010/3/30/urls_are_the_uniform_way_to_locate_resources/).\n// Here's how to parse URLs in Go.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"net/url\"\n)\n\nfunc main() {\n\n\t// We'll parse this example URL, which includes a\n\t// scheme, authentication info, host, port, path,\n\t// query params, and query fragment.\n\ts := \"postgres://user:pass@host.com:5432/path?k=v#f\"\n\n\t// Parse the URL and ensure there are no errors.\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Accessing the scheme is straightforward.\n\tfmt.Println(u.Scheme)\n\n\t// `User` contains all authentication info; call\n\t// `Username` and `Password` on this for individual\n\t// values.\n\tfmt.Println(u.User)\n\tfmt.Println(u.User.Username())\n\tp, _ := u.User.Password()\n\tfmt.Println(p)\n\n\t// The `Host` contains both the hostname and the port,\n\t// if present. Use `SplitHostPort` to extract them.\n\tfmt.Println(u.Host)\n\thost, port, _ := net.SplitHostPort(u.Host)\n\tfmt.Println(host)\n\tfmt.Println(port)\n\n\t// Here we extract the `path` and the fragment after\n\t// the `#`.\n\tfmt.Println(u.Path)\n\tfmt.Println(u.Fragment)\n\n\t// To get query params in a string of `k=v` format,\n\t// use `RawQuery`. You can also parse query params\n\t// into a map. The parsed query param maps are from\n\t// strings to slices of strings, so index into `[0]`\n\t// if you only want the first value.\n\tfmt.Println(u.RawQuery)\n\tm, _ := url.ParseQuery(u.RawQuery)\n\tfmt.Println(m)\n\tfmt.Println(m[\"k\"][0])\n}\n"
  },
  {
    "path": "examples/url-parsing/url-parsing.hash",
    "content": "7e77917c98bd88187b4fed2b8c988afdd0b0df7d\nfHTQn9X7l1B\n"
  },
  {
    "path": "examples/url-parsing/url-parsing.sh",
    "content": "# Running our URL parsing program shows all the different\n# pieces that we extracted.\n$ go run url-parsing.go \npostgres\nuser:pass\nuser\npass\nhost.com:5432\nhost.com\n5432\n/path\nf\nk=v\nmap[k:[v]]\nv\n"
  },
  {
    "path": "examples/values/values.go",
    "content": "// Go has various value types including strings,\n// integers, floats, booleans, etc. Here are a few\n// basic examples.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// Strings, which can be added together with `+`.\n\tfmt.Println(\"go\" + \"lang\")\n\n\t// Integers and floats.\n\tfmt.Println(\"1+1 =\", 1+1)\n\tfmt.Println(\"7.0/3.0 =\", 7.0/3.0)\n\n\t// Booleans, with boolean operators as you'd expect.\n\tfmt.Println(true && false)\n\tfmt.Println(true || false)\n\tfmt.Println(!true)\n}\n"
  },
  {
    "path": "examples/values/values.hash",
    "content": "476982956a689418d548148af5f17145de16f063\nYnVS3LZr8pk\n"
  },
  {
    "path": "examples/values/values.sh",
    "content": "$ go run values.go\ngolang\n1+1 = 2\n7.0/3.0 = 2.3333333333333335\nfalse\ntrue\nfalse\n"
  },
  {
    "path": "examples/variables/variables.go",
    "content": "// In Go, _variables_ are explicitly declared and used by\n// the compiler to e.g. check type-correctness of function\n// calls.\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n\t// `var` declares 1 or more variables.\n\tvar a = \"initial\"\n\tfmt.Println(a)\n\n\t// You can declare multiple variables at once.\n\tvar b, c int = 1, 2\n\tfmt.Println(b, c)\n\n\t// Go will infer the type of initialized variables.\n\tvar d = true\n\tfmt.Println(d)\n\n\t// Variables declared without a corresponding\n\t// initialization are _zero-valued_. For example, the\n\t// zero value for an `int` is `0`.\n\tvar e int\n\tfmt.Println(e)\n\n\t// The `:=` syntax is shorthand for declaring and\n\t// initializing a variable, e.g. for\n\t// `var f string = \"apple\"` in this case.\n\t// This syntax is only available inside functions.\n\tf := \"apple\"\n\tfmt.Println(f)\n}\n"
  },
  {
    "path": "examples/variables/variables.hash",
    "content": "9aeef52b289d7ad9b9ac79f129d4e49f956c60ef\nN5rWndIliJW\n"
  },
  {
    "path": "examples/variables/variables.sh",
    "content": "$ go run variables.go\ninitial\n1 2\ntrue\n0\napple\n"
  },
  {
    "path": "examples/variadic-functions/variadic-functions.go",
    "content": "// [_Variadic functions_](https://en.wikipedia.org/wiki/Variadic_function)\n// can be called with any number of trailing arguments.\n// For example, `fmt.Println` is a common variadic\n// function.\n\npackage main\n\nimport \"fmt\"\n\n// Here's a function that will take an arbitrary number\n// of `int`s as arguments.\nfunc sum(nums ...int) {\n\tfmt.Print(nums, \" \")\n\ttotal := 0\n\t// Within the function, the type of `nums` is\n\t// equivalent to `[]int`. We can call `len(nums)`,\n\t// iterate over it with `range`, etc.\n\tfor _, num := range nums {\n\t\ttotal += num\n\t}\n\tfmt.Println(total)\n}\n\nfunc main() {\n\n\t// Variadic functions can be called in the usual way\n\t// with individual arguments.\n\tsum(1, 2)\n\tsum(1, 2, 3)\n\n\t// If you already have multiple args in a slice,\n\t// apply them to a variadic function using\n\t// `func(slice...)` like this.\n\tnums := []int{1, 2, 3, 4}\n\tsum(nums...)\n}\n"
  },
  {
    "path": "examples/variadic-functions/variadic-functions.hash",
    "content": "561184169a1b4c3d4970d496b282cc81016583d6\nglNdE8aKPNq\n"
  },
  {
    "path": "examples/variadic-functions/variadic-functions.sh",
    "content": "$ go run variadic-functions.go \n[1 2] 3\n[1 2 3] 6\n[1 2 3 4] 10\n\n# Another key aspect of functions in Go is their ability\n# to form closures, which we'll look at next.\n"
  },
  {
    "path": "examples/waitgroups/waitgroups.go",
    "content": "// To wait for multiple goroutines to finish, we can\n// use a *wait group*.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n)\n\n// This is the function we'll run in every goroutine.\nfunc worker(id int) {\n\tfmt.Printf(\"Worker %d starting\\n\", id)\n\n\t// Sleep to simulate an expensive task.\n\ttime.Sleep(time.Second)\n\tfmt.Printf(\"Worker %d done\\n\", id)\n}\n\nfunc main() {\n\n\t// This WaitGroup is used to wait for all the\n\t// goroutines launched here to finish. Note: if a WaitGroup is\n\t// explicitly passed into functions, it should be done *by pointer*.\n\tvar wg sync.WaitGroup\n\n\t// Launch several goroutines using `WaitGroup.Go`\n\tfor i := 1; i <= 5; i++ {\n\t\twg.Go(func() {\n\t\t\tworker(i)\n\t\t})\n\t}\n\n\t// Block until all the goroutines started by `wg` are\n\t// done. A goroutine is done when the function it invokes\n\t// returns.\n\twg.Wait()\n\n\t// Note that this approach has no straightforward way\n\t// to propagate errors from workers. For more\n\t// advanced use cases, consider using the\n\t// [errgroup package](https://pkg.go.dev/golang.org/x/sync/errgroup).\n}\n"
  },
  {
    "path": "examples/waitgroups/waitgroups.hash",
    "content": "97b564243e41a3a86f8c8417268fa942c05d881f\ncsaELahJTWt\n"
  },
  {
    "path": "examples/waitgroups/waitgroups.sh",
    "content": "$ go run waitgroups.go\nWorker 5 starting\nWorker 3 starting\nWorker 4 starting\nWorker 1 starting\nWorker 2 starting\nWorker 4 done\nWorker 1 done\nWorker 2 done\nWorker 5 done\nWorker 3 done\n\n# The order of workers starting up and finishing\n# is likely to be different for each invocation.\n"
  },
  {
    "path": "examples/worker-pools/worker-pools.go",
    "content": "// In this example we'll look at how to implement\n// a _worker pool_ using goroutines and channels.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// Here's the worker, of which we'll run several\n// concurrent instances. These workers will receive\n// work on the `jobs` channel and send the corresponding\n// results on `results`. We'll sleep a second per job to\n// simulate an expensive task.\nfunc worker(id int, jobs <-chan int, results chan<- int) {\n\tfor j := range jobs {\n\t\tfmt.Println(\"worker\", id, \"started  job\", j)\n\t\ttime.Sleep(time.Second)\n\t\tfmt.Println(\"worker\", id, \"finished job\", j)\n\t\tresults <- j * 2\n\t}\n}\n\nfunc main() {\n\n\t// In order to use our pool of workers we need to send\n\t// them work and collect their results. We make 2\n\t// channels for this.\n\tconst numJobs = 5\n\tjobs := make(chan int, numJobs)\n\tresults := make(chan int, numJobs)\n\n\t// This starts up 3 workers, initially blocked\n\t// because there are no jobs yet.\n\tfor w := 1; w <= 3; w++ {\n\t\tgo worker(w, jobs, results)\n\t}\n\n\t// Here we send 5 `jobs` and then `close` that\n\t// channel to indicate that's all the work we have.\n\tfor j := 1; j <= numJobs; j++ {\n\t\tjobs <- j\n\t}\n\tclose(jobs)\n\n\t// Finally we collect all the results of the work.\n\t// This also ensures that the worker goroutines have\n\t// finished. An alternative way to wait for multiple\n\t// goroutines is to use a [WaitGroup](waitgroups).\n\tfor a := 1; a <= numJobs; a++ {\n\t\t<-results\n\t}\n}\n"
  },
  {
    "path": "examples/worker-pools/worker-pools.hash",
    "content": "f6fd187061dfd0ae5ae8243efa3a6fcfa0777c84\nhiSJJsYZJKL\n"
  },
  {
    "path": "examples/worker-pools/worker-pools.sh",
    "content": "# Our running program shows the 5 jobs being executed by\n# various workers. The program only takes about 2 seconds\n# despite doing about 5 seconds of total work because\n# there are 3 workers operating concurrently.\n$ time go run worker-pools.go \nworker 1 started  job 1\nworker 2 started  job 2\nworker 3 started  job 3\nworker 1 finished job 1\nworker 1 started  job 4\nworker 2 finished job 2\nworker 2 started  job 5\nworker 3 finished job 3\nworker 1 finished job 4\nworker 2 finished job 5\n\nreal\t0m2.358s\n"
  },
  {
    "path": "examples/writing-files/writing-files.go",
    "content": "// Writing files in Go follows similar patterns to the\n// ones we saw earlier for reading.\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc check(e error) {\n\tif e != nil {\n\t\tpanic(e)\n\t}\n}\n\nfunc main() {\n\n\t// To start, here's how to dump a string (or just\n\t// bytes) into a file.\n\td1 := []byte(\"hello\\ngo\\n\")\n\tpath1 := filepath.Join(os.TempDir(), \"dat1\")\n\terr := os.WriteFile(path1, d1, 0644)\n\tcheck(err)\n\n\t// For more granular writes, open a file for writing.\n\tpath2 := filepath.Join(os.TempDir(), \"dat2\")\n\tf, err := os.Create(path2)\n\tcheck(err)\n\n\t// It's idiomatic to defer a `Close` immediately\n\t// after opening a file.\n\tdefer f.Close()\n\n\t// You can `Write` byte slices as you'd expect.\n\td2 := []byte{115, 111, 109, 101, 10}\n\tn2, err := f.Write(d2)\n\tcheck(err)\n\tfmt.Printf(\"wrote %d bytes\\n\", n2)\n\n\t// A `WriteString` is also available.\n\tn3, err := f.WriteString(\"writes\\n\")\n\tcheck(err)\n\tfmt.Printf(\"wrote %d bytes\\n\", n3)\n\n\t// Issue a `Sync` to flush writes to stable storage.\n\tf.Sync()\n\n\t// `bufio` provides buffered writers in addition\n\t// to the buffered readers we saw earlier.\n\tw := bufio.NewWriter(f)\n\tn4, err := w.WriteString(\"buffered\\n\")\n\tcheck(err)\n\tfmt.Printf(\"wrote %d bytes\\n\", n4)\n\n\t// Use `Flush` to ensure all buffered operations have\n\t// been applied to the underlying writer.\n\tw.Flush()\n\n}\n"
  },
  {
    "path": "examples/writing-files/writing-files.hash",
    "content": "b93857561df33d0ed970d15e26f321627e770655\niuKQDnKfl2T\n"
  },
  {
    "path": "examples/writing-files/writing-files.sh",
    "content": "# Try running the file-writing code.\n$ go run writing-files.go \nwrote 5 bytes\nwrote 7 bytes\nwrote 9 bytes\n\n# Then check the contents of the written files.\n$ cat /tmp/dat1\nhello\ngo\n$ cat /tmp/dat2\nsome\nwrites\nbuffered\n\n# Next we'll look at applying some of the file I/O ideas\n# we've just seen to the `stdin` and `stdout` streams.\n"
  },
  {
    "path": "examples/xml/xml.go",
    "content": "// Go offers built-in support for XML and XML-like\n// formats with the `encoding/xml` package.\n\npackage main\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n)\n\n// Plant will be mapped to XML. Similarly to the\n// JSON examples, field tags contain directives for the\n// encoder and decoder. Here we use some special features\n// of the XML package: the `XMLName` field name dictates\n// the name of the XML element representing this struct;\n// `id,attr` means that the `Id` field is an XML\n// _attribute_ rather than a nested element.\ntype Plant struct {\n\tXMLName xml.Name `xml:\"plant\"`\n\tId      int      `xml:\"id,attr\"`\n\tName    string   `xml:\"name\"`\n\tOrigin  []string `xml:\"origin\"`\n}\n\nfunc (p Plant) String() string {\n\treturn fmt.Sprintf(\"Plant id=%v, name=%v, origin=%v\",\n\t\tp.Id, p.Name, p.Origin)\n}\n\nfunc main() {\n\tcoffee := &Plant{Id: 27, Name: \"Coffee\"}\n\tcoffee.Origin = []string{\"Ethiopia\", \"Brazil\"}\n\n\t// Emit XML representing our plant; using\n\t// `MarshalIndent` to produce a more\n\t// human-readable output.\n\tout, _ := xml.MarshalIndent(coffee, \" \", \"  \")\n\tfmt.Println(string(out))\n\n\t// To add a generic XML header to the output, append\n\t// it explicitly.\n\tfmt.Println(xml.Header + string(out))\n\n\t// Use `Unmarshal` to parse a stream of bytes with XML\n\t// into a data structure. If the XML is malformed or\n\t// cannot be mapped onto Plant, a descriptive error\n\t// will be returned.\n\tvar p Plant\n\tif err := xml.Unmarshal(out, &p); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(p)\n\n\ttomato := &Plant{Id: 81, Name: \"Tomato\"}\n\ttomato.Origin = []string{\"Mexico\", \"California\"}\n\n\t// The `parent>child>plant` field tag tells the encoder\n\t// to nest all `plant`s under `<parent><child>...`\n\ttype Nesting struct {\n\t\tXMLName xml.Name `xml:\"nesting\"`\n\t\tPlants  []*Plant `xml:\"parent>child>plant\"`\n\t}\n\n\tnesting := &Nesting{}\n\tnesting.Plants = []*Plant{coffee, tomato}\n\n\tout, _ = xml.MarshalIndent(nesting, \" \", \"  \")\n\tfmt.Println(string(out))\n}\n"
  },
  {
    "path": "examples/xml/xml.hash",
    "content": "d64993474fdf0571436db63a82974d74932ba256\nvsP5mIrNJOG\n"
  },
  {
    "path": "examples/xml/xml.sh",
    "content": "$ go run xml.go\n <plant id=\"27\">\n   <name>Coffee</name>\n   <origin>Ethiopia</origin>\n   <origin>Brazil</origin>\n </plant>\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <plant id=\"27\">\n   <name>Coffee</name>\n   <origin>Ethiopia</origin>\n   <origin>Brazil</origin>\n </plant>\nPlant id=27, name=Coffee, origin=[Ethiopia Brazil]\n <nesting>\n   <parent>\n     <child>\n       <plant id=\"27\">\n         <name>Coffee</name>\n         <origin>Ethiopia</origin>\n         <origin>Brazil</origin>\n       </plant>\n       <plant id=\"81\">\n         <name>Tomato</name>\n         <origin>Mexico</origin>\n         <origin>California</origin>\n       </plant>\n     </child>\n   </parent>\n </nesting>\n"
  },
  {
    "path": "examples.txt",
    "content": "Hello World\nValues\nVariables\nConstants\nFor\nIf/Else\nSwitch\nArrays\nSlices\nMaps\nFunctions\nMultiple Return Values\nVariadic Functions\nClosures\nRecursion\nRange over Built-in Types\nPointers\nStrings and Runes\nStructs\nMethods\nInterfaces\nEnums\nStruct Embedding\nGenerics\nRange over Iterators\nErrors\nCustom Errors\nGoroutines\nChannels\nChannel Buffering\nChannel Synchronization\nChannel Directions\nSelect\nTimeouts\nNon-Blocking Channel Operations\nClosing Channels\nRange over Channels\nTimers\nTickers\nWorker Pools\nWaitGroups\nRate Limiting\nAtomic Counters\nMutexes\nStateful Goroutines\nSorting\nSorting by Functions\nPanic\nDefer\nRecover\nString Functions\nString Formatting\nText Templates\nRegular Expressions\nJSON\nXML\nTime\nEpoch\nTime Formatting / Parsing\nRandom Numbers\nNumber Parsing\nURL Parsing\nSHA256 Hashes\nBase64 Encoding\nReading Files\nWriting Files\nLine Filters\nFile Paths\nDirectories\nTemporary Files and Directories\nEmbed Directive\nTesting and Benchmarking\nCommand-Line Arguments\nCommand-Line Flags\nCommand-Line Subcommands\nEnvironment Variables\nLogging\nHTTP Client\nHTTP Server\nTCP Server\nContext\nSpawning Processes\nExec'ing Processes\nSignals\nExit\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/mmcgrana/gobyexample\n\ngo 1.26.0\n\nrequire (\n\tgithub.com/alecthomas/chroma/v2 v2.10.0\n\tgithub.com/aws/aws-sdk-go-v2 v1.21.2\n\tgithub.com/aws/aws-sdk-go-v2/config v1.19.1\n\tgithub.com/aws/aws-sdk-go-v2/service/s3 v1.40.2\n\tgithub.com/russross/blackfriday/v2 v2.1.0\n)\n\nrequire (\n\tgithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect\n\tgithub.com/aws/smithy-go v1.15.0 // indirect\n\tgithub.com/dlclark/regexp2 v1.10.0 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink=\ngithub.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=\ngithub.com/alecthomas/chroma/v2 v2.10.0 h1:T2iQOCCt4pRmRMfL55gTodMtc7cU0y7lc1Jb8/mK/64=\ngithub.com/alecthomas/chroma/v2 v2.10.0/go.mod h1:4TQu7gdfuPjSh76j78ietmqh9LiurGF0EpseFXdKMBw=\ngithub.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=\ngithub.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=\ngithub.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA=\ngithub.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM=\ngithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 h1:Sc82v7tDQ/vdU1WtuSyzZ1I7y/68j//HJ6uozND1IDs=\ngithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14/go.mod h1:9NCTOURS8OpxvoAVHq79LK81/zC78hfRWFn+aL0SPcY=\ngithub.com/aws/aws-sdk-go-v2/config v1.19.1 h1:oe3vqcGftyk40icfLymhhhNysAwk0NfiwkDi2GTPMXs=\ngithub.com/aws/aws-sdk-go-v2/config v1.19.1/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE=\ngithub.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8=\ngithub.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg=\ngithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ=\ngithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg=\ngithub.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y=\ngithub.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ=\ngithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc=\ngithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8=\ngithub.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4=\ngithub.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE=\ngithub.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6 h1:wmGLw2i8ZTlHLw7a9ULGfQbuccw8uIiNr6sol5bFzc8=\ngithub.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6/go.mod h1:Q0Hq2X/NuL7z8b1Dww8rmOFl+jzusKEcyvkKspwdpyc=\ngithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58=\ngithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8=\ngithub.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38 h1:skaFGzv+3kA+v2BPKhuekeb1Hbb105+44r8ASC+q5SE=\ngithub.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38/go.mod h1:epIZoRSSbRIwLPJU5F+OldHhwZPBdpDeQkRdCeY3+00=\ngithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k=\ngithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck=\ngithub.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6 h1:9ulSU5ClouoPIYhDQdg9tpl83d5Yb91PXTKK+17q+ow=\ngithub.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6/go.mod h1:lnc2taBsR9nTlz9meD+lhFZZ9EWY712QHrRflWpTcOA=\ngithub.com/aws/aws-sdk-go-v2/service/s3 v1.40.2 h1:Ll5/YVCOzRB+gxPqs2uD0R7/MyATC0w85626glSKmp4=\ngithub.com/aws/aws-sdk-go-v2/service/s3 v1.40.2/go.mod h1:Zjfqt7KhQK+PO1bbOsFNzKgaq7TcxzmEoDWN8lM0qzQ=\ngithub.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k=\ngithub.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo=\ngithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk=\ngithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg=\ngithub.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU=\ngithub.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ=\ngithub.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8=\ngithub.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=\ngithub.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=\ngithub.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=\ngithub.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=\ngithub.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=\ngithub.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n"
  },
  {
    "path": "public/404.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Not Found</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <body>\n    <div id=\"intro\">\n      <h2><a href=\"./\">Go by Example</a></h2>\n      <p>Sorry, we couldn't find that! Check out the <a href=\"./\">home page</a>?</p>\n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "public/arrays",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Arrays</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'switch';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'slices';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"arrays\">\n      <h2><a href=\"./\">Go by Example</a>: Arrays</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In Go, an <em>array</em> is a numbered sequence of elements of a\nspecific length. In typical Go code, <a href=\"slices\">slices</a> are\nmuch more common; arrays are useful in some special\nscenarios.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/-NFSggT7dFH\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we create an array <code>a</code> that will hold exactly\n5 <code>int</code>s. The type of elements and length are both\npart of the array&rsquo;s type. By default an array is\nzero-valued, which for <code>int</code>s means <code>0</code>s.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">a</span> <span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">]</span><span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;emp:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">a</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can set a value at an index using the\n<code>array[index] = value</code> syntax, and get a value with\n<code>array[index]</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">a</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"mi\">100</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;set:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">a</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;get:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">a</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">])</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The builtin <code>len</code> returns the length of an array.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;len:&#34;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use this syntax to declare and initialize an array\nin one line.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b</span> <span class=\"o\">:=</span> <span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;dcl:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">b</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also have the compiler count the number of\nelements for you with <code>...</code></p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b</span> <span class=\"p\">=</span> <span class=\"p\">[</span><span class=\"o\">...</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;dcl:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">b</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you specify the index with <code>:</code>, the elements in\nbetween will be zeroed.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b</span> <span class=\"p\">=</span> <span class=\"p\">[</span><span class=\"o\">...</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">:</span> <span class=\"mi\">400</span><span class=\"p\">,</span> <span class=\"mi\">500</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;idx:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">b</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Array types are one-dimensional, but you can\ncompose types to build multi-dimensional data\nstructures.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">twoD</span> <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">][</span><span class=\"mi\">3</span><span class=\"p\">]</span><span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">2</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"nx\">j</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">twoD</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">][</span><span class=\"nx\">j</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"nx\">i</span> <span class=\"o\">+</span> <span class=\"nx\">j</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;2d: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">twoD</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can create and initialize multi-dimensional\narrays at once too.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">twoD</span> <span class=\"p\">=</span> <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">][</span><span class=\"mi\">3</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;2d: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">twoD</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that arrays appear in the form <code>[v1 v2 v3 ...]</code>\nwhen printed with <code>fmt.Println</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run arrays.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">emp: [0 0 0 0 0]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">set: [0 0 0 0 100]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">get: 100\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">len: 5\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">dcl: [1 2 3 4 5]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">dcl: [1 2 3 4 5]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">idx: [100 0 0 400 500]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2d:  [[0 1 2] [1 2 3]]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2d:  [[1 2 3] [1 2 3]]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"slices\" rel=\"next\">Slices</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    var a [5]int\\u000A    fmt.Println(\\\"emp:\\\", a)\\u000A');codeLines.push('    a[4] \\u003D 100\\u000A    fmt.Println(\\\"set:\\\", a)\\u000A    fmt.Println(\\\"get:\\\", a[4])\\u000A');codeLines.push('    fmt.Println(\\\"len:\\\", len(a))\\u000A');codeLines.push('    b :\\u003D [5]int{1, 2, 3, 4, 5}\\u000A    fmt.Println(\\\"dcl:\\\", b)\\u000A');codeLines.push('    b \\u003D [...]int{1, 2, 3, 4, 5}\\u000A    fmt.Println(\\\"dcl:\\\", b)\\u000A');codeLines.push('    b \\u003D [...]int{100, 3: 400, 500}\\u000A    fmt.Println(\\\"idx:\\\", b)\\u000A');codeLines.push('    var twoD [2][3]int\\u000A    for i :\\u003D range 2 {\\u000A        for j :\\u003D range 3 {\\u000A            twoD[i][j] \\u003D i + j\\u000A        }\\u000A    }\\u000A    fmt.Println(\\\"2d: \\\", twoD)\\u000A');codeLines.push('    twoD \\u003D [2][3]int{\\u000A        {1, 2, 3},\\u000A        {1, 2, 3},\\u000A    }\\u000A    fmt.Println(\\\"2d: \\\", twoD)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/atomic-counters",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Atomic Counters</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'rate-limiting';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'mutexes';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"atomic-counters\">\n      <h2><a href=\"./\">Go by Example</a>: Atomic Counters</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The primary mechanism for managing state in Go is\ncommunication over channels. We saw this for example\nwith <a href=\"worker-pools\">worker pools</a>. There are a few other\noptions for managing state though. Here we&rsquo;ll\nlook at using the <code>sync/atomic</code> package for <em>atomic\ncounters</em> accessed by multiple goroutines.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/yiGAVfTH49v\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;sync&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;sync/atomic&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll use an atomic integer type to represent our\n(always-positive) counter.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">ops</span> <span class=\"nx\">atomic</span><span class=\"p\">.</span><span class=\"nx\">Uint64</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A WaitGroup will help us wait for all goroutines\nto finish their work.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">wg</span> <span class=\"nx\">sync</span><span class=\"p\">.</span><span class=\"nx\">WaitGroup</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll start 50 goroutines that each increment the\ncounter exactly 1000 times.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"mi\">50</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Go</span><span class=\"p\">(</span><span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"mi\">1000</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To atomically increment the counter we use <code>Add</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">ops</span><span class=\"p\">.</span><span class=\"nf\">Add</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">})</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Wait until all the goroutines are done.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Wait</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here no goroutines are writing to &lsquo;ops&rsquo;, but using\n<code>Load</code> it&rsquo;s safe to atomically read a value even while\nother goroutines are (atomically) updating it.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;ops:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">ops</span><span class=\"p\">.</span><span class=\"nf\">Load</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We expect to get exactly 50,000 operations. Had we\nused a non-atomic integer and incremented it with\n<code>ops++</code>, we&rsquo;d likely get a different number,\nchanging between runs, because the goroutines\nwould interfere with each other. Moreover, we&rsquo;d\nget data race failures when running with the\n<code>-race</code> flag.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run atomic-counters.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ops: 50000</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at mutexes, another tool for managing\nstate.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"mutexes\" rel=\"next\">Mutexes</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"sync\\\"\\u000A    \\\"sync/atomic\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    var ops atomic.Uint64\\u000A');codeLines.push('    var wg sync.WaitGroup\\u000A');codeLines.push('    for range 50 {\\u000A        wg.Go(func() {\\u000A            for range 1000 {\\u000A');codeLines.push('                ops.Add(1)\\u000A            }\\u000A        })\\u000A    }\\u000A');codeLines.push('    wg.Wait()\\u000A');codeLines.push('    fmt.Println(\\\"ops:\\\", ops.Load())\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/base64-encoding",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Base64 Encoding</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'sha256-hashes';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'reading-files';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"base64-encoding\">\n      <h2><a href=\"./\">Go by Example</a>: Base64 Encoding</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go provides built-in support for <a href=\"https://en.wikipedia.org/wiki/Base64\">base64\nencoding/decoding</a>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/yztzkirFEvv\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This syntax imports the <code>encoding/base64</code> package with\nthe <code>b64</code> name instead of the default <code>base64</code>. It&rsquo;ll\nsave us some space below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b64</span> <span class=\"s\">&#34;encoding/base64&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s the <code>string</code> we&rsquo;ll encode/decode.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">data</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;abc123!?$*&amp;()&#39;-=@~&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports both standard and URL-compatible\nbase64. Here&rsquo;s how to encode using the standard\nencoder. The encoder requires a <code>[]byte</code> so we\nconvert our <code>string</code> to that type.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">sEnc</span> <span class=\"o\">:=</span> <span class=\"nx\">b64</span><span class=\"p\">.</span><span class=\"nx\">StdEncoding</span><span class=\"p\">.</span><span class=\"nf\">EncodeToString</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"nx\">data</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">sEnc</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Decoding may return an error, which you can check\nif you don&rsquo;t already know the input to be\nwell-formed.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">sDec</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">b64</span><span class=\"p\">.</span><span class=\"nx\">StdEncoding</span><span class=\"p\">.</span><span class=\"nf\">DecodeString</span><span class=\"p\">(</span><span class=\"nx\">sEnc</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">sDec</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This encodes/decodes using a URL-compatible base64\nformat.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">uEnc</span> <span class=\"o\">:=</span> <span class=\"nx\">b64</span><span class=\"p\">.</span><span class=\"nx\">URLEncoding</span><span class=\"p\">.</span><span class=\"nf\">EncodeToString</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"nx\">data</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">uEnc</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">uDec</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">b64</span><span class=\"p\">.</span><span class=\"nx\">URLEncoding</span><span class=\"p\">.</span><span class=\"nf\">DecodeString</span><span class=\"p\">(</span><span class=\"nx\">uEnc</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">uDec</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The string encodes to slightly different values with the\nstandard and URL base64 encoders (trailing <code>+</code> vs <code>-</code>)\nbut they both decode to the original string as desired.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run base64-encoding.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">YWJjMTIzIT8kKiYoKSctPUB+\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">abc123!?$*&amp;()&#39;-=@~</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">YWJjMTIzIT8kKiYoKSctPUB-\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">abc123!?$*&amp;()&#39;-=@~</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"reading-files\" rel=\"next\">Reading Files</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    b64 \\\"encoding/base64\\\"\\u000A    \\\"fmt\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    data :\\u003D \\\"abc123!?$*\\u0026()\\'-\\u003D@~\\\"\\u000A');codeLines.push('    sEnc :\\u003D b64.StdEncoding.EncodeToString([]byte(data))\\u000A    fmt.Println(sEnc)\\u000A');codeLines.push('    sDec, _ :\\u003D b64.StdEncoding.DecodeString(sEnc)\\u000A    fmt.Println(string(sDec))\\u000A    fmt.Println()\\u000A');codeLines.push('    uEnc :\\u003D b64.URLEncoding.EncodeToString([]byte(data))\\u000A    fmt.Println(uEnc)\\u000A    uDec, _ :\\u003D b64.URLEncoding.DecodeString(uEnc)\\u000A    fmt.Println(string(uDec))\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/channel-buffering",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Channel Buffering</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'channels';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'channel-synchronization';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"channel-buffering\">\n      <h2><a href=\"./\">Go by Example</a>: Channel Buffering</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By default channels are <em>unbuffered</em>, meaning that they\nwill only accept sends (<code>chan &lt;-</code>) if there is a\ncorresponding receive (<code>&lt;- chan</code>) ready to receive the\nsent value. <em>Buffered channels</em> accept a limited\nnumber of  values without a corresponding receiver for\nthose values.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/3BRCdRnRszb\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we <code>make</code> a channel of strings buffering up to\n2 values.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">messages</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Because this channel is buffered, we can send these\nvalues into the channel without a corresponding\nconcurrent receive.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">messages</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;buffered&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">messages</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;channel&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Later we can receive these two values as usual.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"o\">&lt;-</span><span class=\"nx\">messages</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"o\">&lt;-</span><span class=\"nx\">messages</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run channel-buffering.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">buffered\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">channel</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"channel-synchronization\" rel=\"next\">Channel Synchronization</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    messages :\\u003D make(chan string, 2)\\u000A');codeLines.push('    messages \\u003C- \\\"buffered\\\"\\u000A    messages \\u003C- \\\"channel\\\"\\u000A');codeLines.push('    fmt.Println(\\u003C-messages)\\u000A    fmt.Println(\\u003C-messages)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/channel-directions",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Channel Directions</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'channel-synchronization';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'select';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"channel-directions\">\n      <h2><a href=\"./\">Go by Example</a>: Channel Directions</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When using channels as function parameters, you can\nspecify if a channel is meant to only send or receive\nvalues. This specificity increases the type-safety of\nthe program.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/mjNJDHwUH4R\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This <code>ping</code> function only accepts a channel for sending\nvalues. It would be a compile-time error to try to\nreceive on this channel.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">ping</span><span class=\"p\">(</span><span class=\"nx\">pings</span> <span class=\"kd\">chan</span><span class=\"o\">&lt;-</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"nx\">msg</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">pings</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">msg</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>pong</code> function accepts one channel for receives\n(<code>pings</code>) and a second for sends (<code>pongs</code>).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">pong</span><span class=\"p\">(</span><span class=\"nx\">pings</span> <span class=\"o\">&lt;-</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"nx\">pongs</span> <span class=\"kd\">chan</span><span class=\"o\">&lt;-</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">msg</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">pings</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">pongs</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">msg</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">pings</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">pongs</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">ping</span><span class=\"p\">(</span><span class=\"nx\">pings</span><span class=\"p\">,</span> <span class=\"s\">&#34;passed message&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">pong</span><span class=\"p\">(</span><span class=\"nx\">pings</span><span class=\"p\">,</span> <span class=\"nx\">pongs</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"o\">&lt;-</span><span class=\"nx\">pongs</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run channel-directions.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">passed message</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"select\" rel=\"next\">Select</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func ping(pings chan\\u003C- string, msg string) {\\u000A    pings \\u003C- msg\\u000A}\\u000A');codeLines.push('func pong(pings \\u003C-chan string, pongs chan\\u003C- string) {\\u000A    msg :\\u003D \\u003C-pings\\u000A    pongs \\u003C- msg\\u000A}\\u000A');codeLines.push('func main() {\\u000A    pings :\\u003D make(chan string, 1)\\u000A    pongs :\\u003D make(chan string, 1)\\u000A    ping(pings, \\\"passed message\\\")\\u000A    pong(pings, pongs)\\u000A    fmt.Println(\\u003C-pongs)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/channel-synchronization",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Channel Synchronization</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'channel-buffering';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'channel-directions';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"channel-synchronization\">\n      <h2><a href=\"./\">Go by Example</a>: Channel Synchronization</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can use channels to synchronize execution\nacross goroutines. Here&rsquo;s an example of using a\nblocking receive to wait for a goroutine to finish.\nWhen waiting for multiple goroutines to finish,\nyou may prefer to use a <a href=\"waitgroups\">WaitGroup</a>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/Nw-1DzIGk5f\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This is the function we&rsquo;ll run in a goroutine. The\n<code>done</code> channel will be used to notify another\ngoroutine that this function&rsquo;s work is done.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nx\">done</span> <span class=\"kd\">chan</span> <span class=\"kt\">bool</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"s\">&#34;working...&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;done&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Send a value to notify that we&rsquo;re done.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">done</span> <span class=\"o\">&lt;-</span> <span class=\"kc\">true</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Start a worker goroutine, giving it the channel to\nnotify on.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">done</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">bool</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nx\">done</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Block until we receive a notification from the\nworker on the channel.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"o\">&lt;-</span><span class=\"nx\">done</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run channel-synchronization.go      \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">working...done                  </span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you removed the <code>&lt;- done</code> line from this program,\nthe program could exit before the <code>worker</code> finished\nits work, or in some cases even before it started.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"channel-directions\" rel=\"next\">Channel Directions</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func worker(done chan bool) {\\u000A    fmt.Print(\\\"working...\\\")\\u000A    time.Sleep(time.Second)\\u000A    fmt.Println(\\\"done\\\")\\u000A');codeLines.push('    done \\u003C- true\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    done :\\u003D make(chan bool, 1)\\u000A    go worker(done)\\u000A');codeLines.push('    \\u003C-done\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/channels",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Channels</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'goroutines';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'channel-buffering';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"channels\">\n      <h2><a href=\"./\">Go by Example</a>: Channels</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Channels</em> are the pipes that connect concurrent\ngoroutines. You can send values into channels from one\ngoroutine and receive those values into another\ngoroutine.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/MaLY7AiAkHM\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Create a new channel with <code>make(chan val-type)</code>.\nChannels are typed by the values they convey.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">messages</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Send</em> a value into a channel using the <code>channel &lt;-</code>\nsyntax. Here we send <code>&quot;ping&quot;</code>  to the <code>messages</code>\nchannel we made above, from a new goroutine.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"nx\">messages</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;ping&#34;</span> <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>&lt;-channel</code> syntax <em>receives</em> a value from the\nchannel. Here we&rsquo;ll receive the <code>&quot;ping&quot;</code> message\nwe sent above and print it out.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">msg</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">messages</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">msg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When we run the program the <code>&quot;ping&quot;</code> message is\nsuccessfully passed from one goroutine to another via\nour channel.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run channels.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ping</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By default sends and receives block until both the\nsender and receiver are ready. This property allowed\nus to wait at the end of our program for the <code>&quot;ping&quot;</code>\nmessage without having to use any other synchronization.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"channel-buffering\" rel=\"next\">Channel Buffering</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    messages :\\u003D make(chan string)\\u000A');codeLines.push('    go func() { messages \\u003C- \\\"ping\\\" }()\\u000A');codeLines.push('    msg :\\u003D \\u003C-messages\\u000A    fmt.Println(msg)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/closing-channels",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Closing Channels</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'non-blocking-channel-operations';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'range-over-channels';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"closing-channels\">\n      <h2><a href=\"./\">Go by Example</a>: Closing Channels</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Closing</em> a channel indicates that no more values\nwill be sent on it. This can be useful to communicate\ncompletion to the channel&rsquo;s receivers.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/yZijZHYe22y\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In this example we&rsquo;ll use a <code>jobs</code> channel to\ncommunicate work to be done from the <code>main()</code> goroutine\nto a worker goroutine. When we have no more jobs for\nthe worker we&rsquo;ll <code>close</code> the <code>jobs</code> channel.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">jobs</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">done</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">bool</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s the worker goroutine. It repeatedly receives\nfrom <code>jobs</code> with <code>j, more := &lt;-jobs</code>. In this\nspecial 2-value form of receive, the <code>more</code> value\nwill be <code>false</code> if <code>jobs</code> has been <code>close</code>d and all\nvalues in the channel have already been received.\nWe use this to notify on <code>done</code> when we&rsquo;ve worked\nall our jobs.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">j</span><span class=\"p\">,</span> <span class=\"nx\">more</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">jobs</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">if</span> <span class=\"nx\">more</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received job&#34;</span><span class=\"p\">,</span> <span class=\"nx\">j</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received all jobs&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">done</span> <span class=\"o\">&lt;-</span> <span class=\"kc\">true</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"k\">return</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This sends 3 jobs to the worker over the <code>jobs</code>\nchannel, then closes it.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">j</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">j</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">3</span><span class=\"p\">;</span> <span class=\"nx\">j</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">jobs</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">j</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sent job&#34;</span><span class=\"p\">,</span> <span class=\"nx\">j</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">close</span><span class=\"p\">(</span><span class=\"nx\">jobs</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sent all jobs&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We await the worker using the\n<a href=\"channel-synchronization\">synchronization</a> approach\nwe saw earlier.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"o\">&lt;-</span><span class=\"nx\">done</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Reading from a closed channel succeeds immediately,\nreturning the zero value of the underlying type.\nThe optional second return value is <code>true</code> if the\nvalue received was delivered by a successful send\noperation to the channel, or <code>false</code> if it was a\nzero value generated because the channel is closed\nand empty.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">ok</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">jobs</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received more jobs:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">ok</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run closing-channels.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sent job 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received job 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sent job 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received job 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sent job 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received job 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sent all jobs\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received all jobs\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received more jobs: false</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The idea of closed channels leads naturally to our next\nexample: <code>range</code> over channels.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"range-over-channels\" rel=\"next\">Range over Channels</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A    jobs :\\u003D make(chan int, 5)\\u000A    done :\\u003D make(chan bool)\\u000A');codeLines.push('    go func() {\\u000A        for {\\u000A            j, more :\\u003D \\u003C-jobs\\u000A            if more {\\u000A                fmt.Println(\\\"received job\\\", j)\\u000A            } else {\\u000A                fmt.Println(\\\"received all jobs\\\")\\u000A                done \\u003C- true\\u000A                return\\u000A            }\\u000A        }\\u000A    }()\\u000A');codeLines.push('    for j :\\u003D 1; j \\u003C\\u003D 3; j++ {\\u000A        jobs \\u003C- j\\u000A        fmt.Println(\\\"sent job\\\", j)\\u000A    }\\u000A    close(jobs)\\u000A    fmt.Println(\\\"sent all jobs\\\")\\u000A');codeLines.push('    \\u003C-done\\u000A');codeLines.push('    _, ok :\\u003D \\u003C-jobs\\u000A    fmt.Println(\\\"received more jobs:\\\", ok)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/closures",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Closures</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'variadic-functions';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'recursion';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"closures\">\n      <h2><a href=\"./\">Go by Example</a>: Closures</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports <a href=\"https://en.wikipedia.org/wiki/Anonymous_function\"><em>anonymous functions</em></a>,\nwhich can form <a href=\"https://en.wikipedia.org/wiki/Closure_(computer_science)\"><em>closures</em></a>.\nAnonymous functions are useful when you want to define\na function inline without having to name it.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/NpgpzS8ZG8y\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This function <code>intSeq</code> returns another function, which\nwe define anonymously in the body of <code>intSeq</code>. The\nreturned function <em>closes over</em> the variable <code>i</code> to\nform a closure.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">intSeq</span><span class=\"p\">()</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">i</span><span class=\"o\">++</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">i</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We call <code>intSeq</code>, assigning the result (a function)\nto <code>nextInt</code>. This function value captures its\nown <code>i</code> value, which will be updated each time\nwe call <code>nextInt</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">nextInt</span> <span class=\"o\">:=</span> <span class=\"nf\">intSeq</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>See the effect of the closure by calling <code>nextInt</code>\na few times.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">nextInt</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">nextInt</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">nextInt</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To confirm that the state is unique to that\nparticular function, create and test a new one.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">newInts</span> <span class=\"o\">:=</span> <span class=\"nf\">intSeq</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">newInts</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run closures.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The last feature of functions we&rsquo;ll look at for now is\nrecursion.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"recursion\" rel=\"next\">Recursion</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func intSeq() func() int {\\u000A    i :\\u003D 0\\u000A    return func() int {\\u000A        i++\\u000A        return i\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    nextInt :\\u003D intSeq()\\u000A');codeLines.push('    fmt.Println(nextInt())\\u000A    fmt.Println(nextInt())\\u000A    fmt.Println(nextInt())\\u000A');codeLines.push('    newInts :\\u003D intSeq()\\u000A    fmt.Println(newInts())\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/command-line-arguments",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Command-Line Arguments</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'testing-and-benchmarking';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'command-line-flags';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"command-line-arguments\">\n      <h2><a href=\"./\">Go by Example</a>: Command-Line Arguments</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"https://en.wikipedia.org/wiki/Command-line_interface#Arguments\"><em>Command-line arguments</em></a>\nare a common way to parameterize execution of programs.\nFor example, <code>go run hello.go</code> uses <code>run</code> and\n<code>hello.go</code> arguments to the <code>go</code> program.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/UYCEvh9d2Zb\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>os.Args</code> provides access to raw command-line\narguments. Note that the first value in this slice\nis the path to the program, and <code>os.Args[1:]</code>\nholds the arguments to the program.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">argsWithProg</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">argsWithoutProg</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can get individual args with normal indexing.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">arg</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span><span class=\"p\">[</span><span class=\"mi\">3</span><span class=\"p\">]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">argsWithProg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">argsWithoutProg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">arg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To experiment with command-line arguments it&rsquo;s best to\nbuild a binary with <code>go build</code> first.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go build command-line-arguments.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-arguments a b c d\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[./command-line-arguments a b c d]       \n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[a b c d]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">c</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at more advanced command-line processing\nwith flags.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"command-line-flags\" rel=\"next\">Command-Line Flags</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    argsWithProg :\\u003D os.Args\\u000A    argsWithoutProg :\\u003D os.Args[1:]\\u000A');codeLines.push('    arg :\\u003D os.Args[3]\\u000A');codeLines.push('    fmt.Println(argsWithProg)\\u000A    fmt.Println(argsWithoutProg)\\u000A    fmt.Println(arg)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/command-line-flags",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Command-Line Flags</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'command-line-arguments';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'command-line-subcommands';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"command-line-flags\">\n      <h2><a href=\"./\">Go by Example</a>: Command-Line Flags</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"https://en.wikipedia.org/wiki/Command-line_interface#Command-line_option\"><em>Command-line flags</em></a>\nare a common way to specify options for command-line\nprograms. For example, in <code>wc -l</code> the <code>-l</code> is a\ncommand-line flag.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/IUPZlYSigc3\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go provides a <code>flag</code> package supporting basic\ncommand-line flag parsing. We&rsquo;ll use this package to\nimplement our example command-line program.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;flag&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Basic flag declarations are available for string,\ninteger, and boolean options. Here we declare a\nstring flag <code>word</code> with a default value <code>&quot;foo&quot;</code>\nand a short description. This <code>flag.String</code> function\nreturns a string pointer (not a string value);\nwe&rsquo;ll see how to use this pointer below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wordPtr</span> <span class=\"o\">:=</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">String</span><span class=\"p\">(</span><span class=\"s\">&#34;word&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;a string&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This declares <code>numb</code> and <code>fork</code> flags, using a\nsimilar approach to the <code>word</code> flag.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">numbPtr</span> <span class=\"o\">:=</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">Int</span><span class=\"p\">(</span><span class=\"s\">&#34;numb&#34;</span><span class=\"p\">,</span> <span class=\"mi\">42</span><span class=\"p\">,</span> <span class=\"s\">&#34;an int&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">forkPtr</span> <span class=\"o\">:=</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">Bool</span><span class=\"p\">(</span><span class=\"s\">&#34;fork&#34;</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">,</span> <span class=\"s\">&#34;a bool&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It&rsquo;s also possible to declare an option that uses an\nexisting var declared elsewhere in the program.\nNote that we need to pass in a pointer to the flag\ndeclaration function.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">svar</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">StringVar</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">svar</span><span class=\"p\">,</span> <span class=\"s\">&#34;svar&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;bar&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;a string var&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Once all flags are declared, call <code>flag.Parse()</code>\nto execute the command-line parsing.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we&rsquo;ll just dump out the parsed options and\nany trailing positional arguments. Note that we\nneed to dereference the pointers with e.g. <code>*wordPtr</code>\nto get the actual option values.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;word:&#34;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"nx\">wordPtr</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;numb:&#34;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"nx\">numbPtr</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;fork:&#34;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"nx\">forkPtr</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;svar:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">svar</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;tail:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">Args</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To experiment with the command-line flags program it&rsquo;s\nbest to first compile it and then run the resulting\nbinary directly.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go build command-line-flags.go</span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Try out the built program by first giving it values for\nall flags.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-flags -word=opt -numb=7 -fork -svar=flag\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">word: opt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">numb: 7\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">fork: true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">svar: flag\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">tail: []</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that if you omit flags they automatically take\ntheir default values.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-flags -word=opt\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">word: opt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">numb: 42\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">fork: false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">svar: bar\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">tail: []</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Trailing positional arguments can be provided after\nany flags.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-flags -word=opt a1 a2 a3\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">word: opt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">...\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">tail: [a1 a2 a3]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that the <code>flag</code> package requires all flags to\nappear before positional arguments (otherwise the flags\nwill be interpreted as positional arguments).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-flags -word=opt a1 a2 a3 -numb=7\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">word: opt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">numb: 42\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">fork: false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">svar: bar\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">tail: [a1 a2 a3 -numb=7]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>-h</code> or <code>--help</code> flags to get automatically\ngenerated help text for the command-line program.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-flags -h\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Usage of ./command-line-flags:\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  -fork=false: a bool\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  -numb=42: an int\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  -svar=&#34;bar&#34;: a string var\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  -word=&#34;foo&#34;: a string</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you provide a flag that wasn&rsquo;t specified to the\n<code>flag</code> package, the program will print an error message\nand show the help text again.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-flags -wat\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">flag provided but not defined: -wat\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Usage of ./command-line-flags:\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">...</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"command-line-subcommands\" rel=\"next\">Command-Line Subcommands</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"flag\\\"\\u000A    \\\"fmt\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    wordPtr :\\u003D flag.String(\\\"word\\\", \\\"foo\\\", \\\"a string\\\")\\u000A');codeLines.push('    numbPtr :\\u003D flag.Int(\\\"numb\\\", 42, \\\"an int\\\")\\u000A    forkPtr :\\u003D flag.Bool(\\\"fork\\\", false, \\\"a bool\\\")\\u000A');codeLines.push('    var svar string\\u000A    flag.StringVar(\\u0026svar, \\\"svar\\\", \\\"bar\\\", \\\"a string var\\\")\\u000A');codeLines.push('    flag.Parse()\\u000A');codeLines.push('    fmt.Println(\\\"word:\\\", *wordPtr)\\u000A    fmt.Println(\\\"numb:\\\", *numbPtr)\\u000A    fmt.Println(\\\"fork:\\\", *forkPtr)\\u000A    fmt.Println(\\\"svar:\\\", svar)\\u000A    fmt.Println(\\\"tail:\\\", flag.Args())\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/command-line-subcommands",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Command-Line Subcommands</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'command-line-flags';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'environment-variables';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"command-line-subcommands\">\n      <h2><a href=\"./\">Go by Example</a>: Command-Line Subcommands</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Some command-line tools, like the <code>go</code> tool or <code>git</code>\nhave many <em>subcommands</em>, each with its own set of\nflags. For example, <code>go build</code> and <code>go get</code> are two\ndifferent subcommands of the <code>go</code> tool.\nThe <code>flag</code> package lets us easily define simple\nsubcommands that have their own flags.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/DkvdHKK-XCv\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;flag&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We declare a subcommand using the <code>NewFlagSet</code>\nfunction, and proceed to define new flags specific\nfor this subcommand.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fooCmd</span> <span class=\"o\">:=</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">NewFlagSet</span><span class=\"p\">(</span><span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nx\">ExitOnError</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fooEnable</span> <span class=\"o\">:=</span> <span class=\"nx\">fooCmd</span><span class=\"p\">.</span><span class=\"nf\">Bool</span><span class=\"p\">(</span><span class=\"s\">&#34;enable&#34;</span><span class=\"p\">,</span> <span class=\"kc\">false</span><span class=\"p\">,</span> <span class=\"s\">&#34;enable&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fooName</span> <span class=\"o\">:=</span> <span class=\"nx\">fooCmd</span><span class=\"p\">.</span><span class=\"nf\">String</span><span class=\"p\">(</span><span class=\"s\">&#34;name&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;name&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For a different subcommand we can define different\nsupported flags.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">barCmd</span> <span class=\"o\">:=</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nf\">NewFlagSet</span><span class=\"p\">(</span><span class=\"s\">&#34;bar&#34;</span><span class=\"p\">,</span> <span class=\"nx\">flag</span><span class=\"p\">.</span><span class=\"nx\">ExitOnError</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">barLevel</span> <span class=\"o\">:=</span> <span class=\"nx\">barCmd</span><span class=\"p\">.</span><span class=\"nf\">Int</span><span class=\"p\">(</span><span class=\"s\">&#34;level&#34;</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s\">&#34;level&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The subcommand is expected as the first argument\nto the program.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span><span class=\"p\">)</span> <span class=\"p\">&lt;</span> <span class=\"mi\">2</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;expected &#39;foo&#39; or &#39;bar&#39; subcommands&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Exit</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Check which subcommand is invoked.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">switch</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For every subcommand, we parse its own flags and\nhave access to trailing positional arguments.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"s\">&#34;foo&#34;</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fooCmd</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:])</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;subcommand &#39;foo&#39;&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;  enable:&#34;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"nx\">fooEnable</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;  name:&#34;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"nx\">fooName</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;  tail:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">fooCmd</span><span class=\"p\">.</span><span class=\"nf\">Args</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"s\">&#34;bar&#34;</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">barCmd</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Args</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:])</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;subcommand &#39;bar&#39;&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;  level:&#34;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"nx\">barLevel</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;  tail:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">barCmd</span><span class=\"p\">.</span><span class=\"nf\">Args</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;expected &#39;foo&#39; or &#39;bar&#39; subcommands&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Exit</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go build command-line-subcommands.go </span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>First invoke the foo subcommand.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-subcommands foo -enable -name=joe a1 a2\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">subcommand &#39;foo&#39;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  enable: true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  name: joe\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  tail: [a1 a2]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now try bar.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-subcommands bar -level 8 a1\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">subcommand &#39;bar&#39;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  level: 8\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  tail: [a1]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>But bar won&rsquo;t accept foo&rsquo;s flags.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./command-line-subcommands bar -enable a1\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">flag provided but not defined: -enable\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Usage of bar:\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  -level int\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">        level</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at environment variables, another common\nway to parameterize programs.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"environment-variables\" rel=\"next\">Environment Variables</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"flag\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    fooCmd :\\u003D flag.NewFlagSet(\\\"foo\\\", flag.ExitOnError)\\u000A    fooEnable :\\u003D fooCmd.Bool(\\\"enable\\\", false, \\\"enable\\\")\\u000A    fooName :\\u003D fooCmd.String(\\\"name\\\", \\\"\\\", \\\"name\\\")\\u000A');codeLines.push('    barCmd :\\u003D flag.NewFlagSet(\\\"bar\\\", flag.ExitOnError)\\u000A    barLevel :\\u003D barCmd.Int(\\\"level\\\", 0, \\\"level\\\")\\u000A');codeLines.push('    if len(os.Args) \\u003C 2 {\\u000A        fmt.Println(\\\"expected \\'foo\\' or \\'bar\\' subcommands\\\")\\u000A        os.Exit(1)\\u000A    }\\u000A');codeLines.push('    switch os.Args[1] {\\u000A');codeLines.push('    case \\\"foo\\\":\\u000A        fooCmd.Parse(os.Args[2:])\\u000A        fmt.Println(\\\"subcommand \\'foo\\'\\\")\\u000A        fmt.Println(\\\"  enable:\\\", *fooEnable)\\u000A        fmt.Println(\\\"  name:\\\", *fooName)\\u000A        fmt.Println(\\\"  tail:\\\", fooCmd.Args())\\u000A    case \\\"bar\\\":\\u000A        barCmd.Parse(os.Args[2:])\\u000A        fmt.Println(\\\"subcommand \\'bar\\'\\\")\\u000A        fmt.Println(\\\"  level:\\\", *barLevel)\\u000A        fmt.Println(\\\"  tail:\\\", barCmd.Args())\\u000A    default:\\u000A        fmt.Println(\\\"expected \\'foo\\' or \\'bar\\' subcommands\\\")\\u000A        os.Exit(1)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/constants",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Constants</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'variables';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'for';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"constants\">\n      <h2><a href=\"./\">Go by Example</a>: Constants</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports <em>constants</em> of character, string, boolean,\nand numeric values.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/LfvIxHlpomp\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;math&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>const</code> declares a constant value.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">const</span> <span class=\"nx\">s</span> <span class=\"kt\">string</span> <span class=\"p\">=</span> <span class=\"s\">&#34;constant&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>const</code> statement can also appear inside a\nfunction body.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">const</span> <span class=\"nx\">n</span> <span class=\"p\">=</span> <span class=\"mi\">500000000</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Constant expressions perform arithmetic with\narbitrary precision.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">const</span> <span class=\"nx\">d</span> <span class=\"p\">=</span> <span class=\"mf\">3e20</span> <span class=\"o\">/</span> <span class=\"nx\">n</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">d</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A numeric constant has no type until it&rsquo;s given\none, such as by an explicit conversion.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">int64</span><span class=\"p\">(</span><span class=\"nx\">d</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A number can be given a type by using it in a\ncontext that requires one, such as a variable\nassignment or function call. For example, here\n<code>math.Sin</code> expects a <code>float64</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">math</span><span class=\"p\">.</span><span class=\"nf\">Sin</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run constant.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">constant\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">6e+11\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">600000000000\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">-0.28470407323754404</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"for\" rel=\"next\">For</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"math\\\"\\u000A)\\u000A');codeLines.push('const s string \\u003D \\\"constant\\\"\\u000A');codeLines.push('func main() {\\u000A    fmt.Println(s)\\u000A');codeLines.push('    const n \\u003D 500000000\\u000A');codeLines.push('    const d \\u003D 3e20 / n\\u000A    fmt.Println(d)\\u000A');codeLines.push('    fmt.Println(int64(d))\\u000A');codeLines.push('    fmt.Println(math.Sin(n))\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/context",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Context</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'tcp-server';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'spawning-processes';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"context\">\n      <h2><a href=\"./\">Go by Example</a>: Context</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In the previous example we looked at setting up a simple\n<a href=\"http-server\">HTTP server</a>. HTTP servers are useful for\ndemonstrating the usage of <code>context.Context</code> for\ncontrolling cancellation. A <code>Context</code> carries deadlines,\ncancellation signals, and other request-scoped values\nacross API boundaries and goroutines.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/7G1TlQrnbF1\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;net/http&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">hello</span><span class=\"p\">(</span><span class=\"nx\">w</span> <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">ResponseWriter</span><span class=\"p\">,</span> <span class=\"nx\">req</span> <span class=\"o\">*</span><span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">Request</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>context.Context</code> is created for each request by\nthe <code>net/http</code> machinery, and is available with\nthe <code>Context()</code> method.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ctx</span> <span class=\"o\">:=</span> <span class=\"nx\">req</span><span class=\"p\">.</span><span class=\"nf\">Context</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;server: hello handler started&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;server: hello handler ended&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Wait for a few seconds before sending a reply to the\nclient. This could simulate some work the server is\ndoing. While working, keep an eye on the context&rsquo;s\n<code>Done()</code> channel for a signal that we should cancel\nthe work and return as soon as possible.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"o\">&lt;-</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">After</span><span class=\"p\">(</span><span class=\"mi\">10</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">):</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Fprintf</span><span class=\"p\">(</span><span class=\"nx\">w</span><span class=\"p\">,</span> <span class=\"s\">&#34;hello\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"o\">&lt;-</span><span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nf\">Done</span><span class=\"p\">():</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The context&rsquo;s <code>Err()</code> method returns an error\nthat explains why the <code>Done()</code> channel was\nclosed.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nf\">Err</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;server:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">internalError</span> <span class=\"o\">:=</span> <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">StatusInternalServerError</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">Error</span><span class=\"p\">(</span><span class=\"nx\">w</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">.</span><span class=\"nf\">Error</span><span class=\"p\">(),</span> <span class=\"nx\">internalError</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>As before, we register our handler on the &ldquo;/hello&rdquo;\nroute, and start serving.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">HandleFunc</span><span class=\"p\">(</span><span class=\"s\">&#34;/hello&#34;</span><span class=\"p\">,</span> <span class=\"nx\">hello</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">ListenAndServe</span><span class=\"p\">(</span><span class=\"s\">&#34;:8090&#34;</span><span class=\"p\">,</span> <span class=\"kc\">nil</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Run the server in the background.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run context.go &amp;</span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Simulate a client request to <code>/hello</code>, hitting\nCtrl+C shortly after starting to signal\ncancellation.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> curl localhost:8090/hello\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">server: hello handler started\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">^C\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">server: context canceled\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">server: hello handler ended</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"spawning-processes\" rel=\"next\">Spawning Processes</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"net/http\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func hello(w http.ResponseWriter, req *http.Request) {\\u000A');codeLines.push('    ctx :\\u003D req.Context()\\u000A    fmt.Println(\\\"server: hello handler started\\\")\\u000A    defer fmt.Println(\\\"server: hello handler ended\\\")\\u000A');codeLines.push('    select {\\u000A    case \\u003C-time.After(10 * time.Second):\\u000A        fmt.Fprintf(w, \\\"hello\\\\n\\\")\\u000A    case \\u003C-ctx.Done():\\u000A');codeLines.push('        err :\\u003D ctx.Err()\\u000A        fmt.Println(\\\"server:\\\", err)\\u000A        internalError :\\u003D http.StatusInternalServerError\\u000A        http.Error(w, err.Error(), internalError)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    http.HandleFunc(\\\"/hello\\\", hello)\\u000A    http.ListenAndServe(\\\":8090\\\", nil)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/custom-errors",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Custom Errors</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'errors';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'goroutines';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"custom-errors\">\n      <h2><a href=\"./\">Go by Example</a>: Custom Errors</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It&rsquo;s possible to define custom error types by\nimplementing the <code>Error()</code> method on them. Here&rsquo;s a\nvariant on the example above that uses a custom type\nto explicitly represent an argument error.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/0WHh8JFOjQq\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;errors&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A custom error type usually has the suffix &ldquo;Error&rdquo;.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">argError</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">arg</span>     <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">message</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Adding this <code>Error</code> method makes <code>argError</code> implement\nthe <code>error</code> interface.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">e</span> <span class=\"o\">*</span><span class=\"nx\">argError</span><span class=\"p\">)</span> <span class=\"nf\">Error</span><span class=\"p\">()</span> <span class=\"kt\">string</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Sprintf</span><span class=\"p\">(</span><span class=\"s\">&#34;%d - %s&#34;</span><span class=\"p\">,</span> <span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nx\">arg</span><span class=\"p\">,</span> <span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nx\">message</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"nx\">arg</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">arg</span> <span class=\"o\">==</span> <span class=\"mi\">42</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Return our custom error.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"o\">&amp;</span><span class=\"nx\">argError</span><span class=\"p\">{</span><span class=\"nx\">arg</span><span class=\"p\">,</span> <span class=\"s\">&#34;can&#39;t work with it&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">arg</span> <span class=\"o\">+</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"kc\">nil</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>errors.AsType</code> is a more advanced version of <code>errors.Is</code>.\nIt checks that a given error (or any error in its chain)\nmatches a specific error type and converts to a value\nof that type, also returning <code>true</code>. If there&rsquo;s no match, the\nsecond return value is <code>false</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"mi\">42</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">ae</span><span class=\"p\">,</span> <span class=\"nx\">ok</span> <span class=\"o\">:=</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nx\">AsType</span><span class=\"p\">[</span><span class=\"o\">*</span><span class=\"nx\">argError</span><span class=\"p\">](</span><span class=\"nx\">err</span><span class=\"p\">);</span> <span class=\"nx\">ok</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">ae</span><span class=\"p\">.</span><span class=\"nx\">arg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">ae</span><span class=\"p\">.</span><span class=\"nx\">message</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;err doesn&#39;t match argError&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run custom-errors.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">42\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">can&#39;t work with it</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"goroutines\" rel=\"next\">Goroutines</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"errors\\\"\\u000A    \\\"fmt\\\"\\u000A)\\u000A');codeLines.push('type argError struct {\\u000A    arg     int\\u000A    message string\\u000A}\\u000A');codeLines.push('func (e *argError) Error() string {\\u000A    return fmt.Sprintf(\\\"%d - %s\\\", e.arg, e.message)\\u000A}\\u000A');codeLines.push('func f(arg int) (int, error) {\\u000A    if arg \\u003D\\u003D 42 {\\u000A');codeLines.push('        return -1, \\u0026argError{arg, \\\"can\\'t work with it\\\"}\\u000A    }\\u000A    return arg + 3, nil\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    _, err :\\u003D f(42)\\u000A    if ae, ok :\\u003D errors.AsType[*argError](err); ok {\\u000A        fmt.Println(ae.arg)\\u000A        fmt.Println(ae.message)\\u000A    } else {\\u000A        fmt.Println(\\\"err doesn\\'t match argError\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/defer",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Defer</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'panic';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'recover';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"defer\">\n      <h2><a href=\"./\">Go by Example</a>: Defer</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Defer</em> is used to ensure that a function call is\nperformed later in a program&rsquo;s execution, usually for\npurposes of cleanup. <code>defer</code> is often used where e.g.\n<code>ensure</code> and <code>finally</code> would be used in other languages.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/9_sJ5XnikSw\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Suppose we wanted to create a file, write to it,\nand then close when we&rsquo;re done. Here&rsquo;s how we could\ndo that with <code>defer</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Immediately after getting a file object with\n<code>createFile</code>, we defer the closing of that file\nwith <code>closeFile</code>. This will be executed at the end\nof the enclosing function (<code>main</code>), after\n<code>writeFile</code> has finished.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">path</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">TempDir</span><span class=\"p\">(),</span> <span class=\"s\">&#34;defer.txt&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span> <span class=\"o\">:=</span> <span class=\"nf\">createFile</span><span class=\"p\">(</span><span class=\"nx\">path</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nf\">closeFile</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">writeFile</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">createFile</span><span class=\"p\">(</span><span class=\"nx\">p</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"o\">*</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">File</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;creating&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Create</span><span class=\"p\">(</span><span class=\"nx\">p</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">f</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">writeFile</span><span class=\"p\">(</span><span class=\"nx\">f</span> <span class=\"o\">*</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">File</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;writing&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Fprintln</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"s\">&#34;data&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It&rsquo;s important to check for errors when closing a\nfile, even in a deferred function.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">closeFile</span><span class=\"p\">(</span><span class=\"nx\">f</span> <span class=\"o\">*</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">File</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;closing&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running the program confirms that the file is closed\nafter being written.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run defer.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">creating\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">writing\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">closing</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"recover\" rel=\"next\">Recover</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A    \\\"path/filepath\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    path :\\u003D filepath.Join(os.TempDir(), \\\"defer.txt\\\")\\u000A    f :\\u003D createFile(path)\\u000A    defer closeFile(f)\\u000A    writeFile(f)\\u000A}\\u000A');codeLines.push('func createFile(p string) *os.File {\\u000A    fmt.Println(\\\"creating\\\")\\u000A    f, err :\\u003D os.Create(p)\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    return f\\u000A}\\u000A');codeLines.push('func writeFile(f *os.File) {\\u000A    fmt.Println(\\\"writing\\\")\\u000A    fmt.Fprintln(f, \\\"data\\\")\\u000A}\\u000A');codeLines.push('func closeFile(f *os.File) {\\u000A    fmt.Println(\\\"closing\\\")\\u000A    err :\\u003D f.Close()\\u000A');codeLines.push('    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/directories",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Directories</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'file-paths';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'temporary-files-and-directories';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"directories\">\n      <h2><a href=\"./\">Go by Example</a>: Directories</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go has several useful functions for working with\n<em>directories</em> in the file system.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/ORNj2BPrLQr\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;io/fs&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">e</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Create a new sub-directory in the current working\ndirectory.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Mkdir</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir&#34;</span><span class=\"p\">,</span> <span class=\"mo\">0755</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When creating temporary directories, it&rsquo;s good\npractice to <code>defer</code> their removal. <code>os.RemoveAll</code>\nwill delete a whole directory tree (similarly to\n<code>rm -rf</code>).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">RemoveAll</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Helper function to create a new empty file.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">createEmptyFile</span> <span class=\"o\">:=</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">name</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">d</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"s\">&#34;&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">WriteFile</span><span class=\"p\">(</span><span class=\"nx\">name</span><span class=\"p\">,</span> <span class=\"nx\">d</span><span class=\"p\">,</span> <span class=\"mo\">0644</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">createEmptyFile</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/file1&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can create a hierarchy of directories, including\nparents with <code>MkdirAll</code>. This is similar to the\ncommand-line <code>mkdir -p</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">MkdirAll</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/parent/child&#34;</span><span class=\"p\">,</span> <span class=\"mo\">0755</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">createEmptyFile</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/parent/file2&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">createEmptyFile</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/parent/file3&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">createEmptyFile</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/parent/child/file4&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>ReadDir</code> lists directory contents, returning a\nslice of <code>os.DirEntry</code> objects.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">ReadDir</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/parent&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Listing subdir/parent&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">entry</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">c</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34; &#34;</span><span class=\"p\">,</span> <span class=\"nx\">entry</span><span class=\"p\">.</span><span class=\"nf\">Name</span><span class=\"p\">(),</span> <span class=\"nx\">entry</span><span class=\"p\">.</span><span class=\"nf\">IsDir</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Chdir</code> lets us change the current working directory,\nsimilarly to <code>cd</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Chdir</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir/parent/child&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now we&rsquo;ll see the contents of <code>subdir/parent/child</code>\nwhen listing the <em>current</em> directory.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">ReadDir</span><span class=\"p\">(</span><span class=\"s\">&#34;.&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Listing subdir/parent/child&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">entry</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">c</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34; &#34;</span><span class=\"p\">,</span> <span class=\"nx\">entry</span><span class=\"p\">.</span><span class=\"nf\">Name</span><span class=\"p\">(),</span> <span class=\"nx\">entry</span><span class=\"p\">.</span><span class=\"nf\">IsDir</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>cd</code> back to where we started.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Chdir</span><span class=\"p\">(</span><span class=\"s\">&#34;../../..&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can also visit a directory <em>recursively</em>,\nincluding all its sub-directories. <code>WalkDir</code> accepts\na callback function to handle every file or\ndirectory visited.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Visiting subdir&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">WalkDir</span><span class=\"p\">(</span><span class=\"s\">&#34;subdir&#34;</span><span class=\"p\">,</span> <span class=\"nx\">visit</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>visit</code> is called for every file or directory found\nrecursively by <code>filepath.WalkDir</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">visit</span><span class=\"p\">(</span><span class=\"nx\">path</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"nx\">d</span> <span class=\"nx\">fs</span><span class=\"p\">.</span><span class=\"nx\">DirEntry</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"kt\">error</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">err</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34; &#34;</span><span class=\"p\">,</span> <span class=\"nx\">path</span><span class=\"p\">,</span> <span class=\"nx\">d</span><span class=\"p\">.</span><span class=\"nf\">IsDir</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"kc\">nil</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run directories.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Listing subdir/parent\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  child true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  file2 false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  file3 false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Listing subdir/parent/child\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  file4 false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Visiting subdir\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir/file1 false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir/parent true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir/parent/child true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir/parent/child/file4 false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir/parent/file2 false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  subdir/parent/file3 false</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"temporary-files-and-directories\" rel=\"next\">Temporary Files and Directories</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"io/fs\\\"\\u000A    \\\"os\\\"\\u000A    \\\"path/filepath\\\"\\u000A)\\u000A');codeLines.push('func check(e error) {\\u000A    if e !\\u003D nil {\\u000A        panic(e)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    err :\\u003D os.Mkdir(\\\"subdir\\\", 0755)\\u000A    check(err)\\u000A');codeLines.push('    defer os.RemoveAll(\\\"subdir\\\")\\u000A');codeLines.push('    createEmptyFile :\\u003D func(name string) {\\u000A        d :\\u003D []byte(\\\"\\\")\\u000A        check(os.WriteFile(name, d, 0644))\\u000A    }\\u000A');codeLines.push('    createEmptyFile(\\\"subdir/file1\\\")\\u000A');codeLines.push('    err \\u003D os.MkdirAll(\\\"subdir/parent/child\\\", 0755)\\u000A    check(err)\\u000A');codeLines.push('    createEmptyFile(\\\"subdir/parent/file2\\\")\\u000A    createEmptyFile(\\\"subdir/parent/file3\\\")\\u000A    createEmptyFile(\\\"subdir/parent/child/file4\\\")\\u000A');codeLines.push('    c, err :\\u003D os.ReadDir(\\\"subdir/parent\\\")\\u000A    check(err)\\u000A');codeLines.push('    fmt.Println(\\\"Listing subdir/parent\\\")\\u000A    for _, entry :\\u003D range c {\\u000A        fmt.Println(\\\" \\\", entry.Name(), entry.IsDir())\\u000A    }\\u000A');codeLines.push('    err \\u003D os.Chdir(\\\"subdir/parent/child\\\")\\u000A    check(err)\\u000A');codeLines.push('    c, err \\u003D os.ReadDir(\\\".\\\")\\u000A    check(err)\\u000A');codeLines.push('    fmt.Println(\\\"Listing subdir/parent/child\\\")\\u000A    for _, entry :\\u003D range c {\\u000A        fmt.Println(\\\" \\\", entry.Name(), entry.IsDir())\\u000A    }\\u000A');codeLines.push('    err \\u003D os.Chdir(\\\"../../..\\\")\\u000A    check(err)\\u000A');codeLines.push('    fmt.Println(\\\"Visiting subdir\\\")\\u000A    err \\u003D filepath.WalkDir(\\\"subdir\\\", visit)\\u000A}\\u000A');codeLines.push('func visit(path string, d fs.DirEntry, err error) error {\\u000A    if err !\\u003D nil {\\u000A        return err\\u000A    }\\u000A    fmt.Println(\\\" \\\", path, d.IsDir())\\u000A    return nil\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/embed-directive",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Embed Directive</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'temporary-files-and-directories';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'testing-and-benchmarking';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"embed-directive\">\n      <h2><a href=\"./\">Go by Example</a>: Embed Directive</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>//go:embed</code> is a <a href=\"https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives\">compiler\ndirective</a> that\nallows programs to include arbitrary files and folders in the Go binary at\nbuild time. Read more about the embed directive\n<a href=\"https://pkg.go.dev/embed\">here</a>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/6m2ll-D52BB\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Import the <code>embed</code> package; if you don&rsquo;t use any exported\nidentifiers from this package, you can do a blank import with <code>_ &quot;embed&quot;</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;embed&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>embed</code> directives accept paths relative to the directory containing the\nGo source file. This directive embeds the contents of the file into the\n<code>string</code> variable immediately following it.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"c1\">//go:embed folder/single_file.txt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"></span><span class=\"kd\">var</span> <span class=\"nx\">fileString</span> <span class=\"kt\">string</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Or embed the contents of the file into a <code>[]byte</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"c1\">//go:embed folder/single_file.txt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"></span><span class=\"kd\">var</span> <span class=\"nx\">fileByte</span> <span class=\"p\">[]</span><span class=\"kt\">byte</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can also embed multiple files or even folders with wildcards. This uses\na variable of the <a href=\"https://pkg.go.dev/embed#FS\">embed.FS type</a>, which\nimplements a simple virtual file system.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"c1\">//go:embed folder/single_file.txt\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">//go:embed folder/*.hash\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"></span><span class=\"kd\">var</span> <span class=\"nx\">folder</span> <span class=\"nx\">embed</span><span class=\"p\">.</span><span class=\"nx\">FS</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Print out the contents of <code>single_file.txt</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"nx\">fileString</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">fileByte</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Retrieve some files from the embedded folder.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">content1</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">folder</span><span class=\"p\">.</span><span class=\"nf\">ReadFile</span><span class=\"p\">(</span><span class=\"s\">&#34;folder/file1.hash&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">content1</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">content2</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">folder</span><span class=\"p\">.</span><span class=\"nf\">ReadFile</span><span class=\"p\">(</span><span class=\"s\">&#34;folder/file2.hash&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">content2</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use these commands to run the example.\n(Note: due to limitation on go playground,\nthis example can only be run on your local machine.)</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> mkdir -p folder\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#34;hello go&#34; &gt; folder/single_file.txt\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#34;123&#34; &gt; folder/file1.hash\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#34;456&#34; &gt; folder/file2.hash</span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run embed-directive.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">123\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">456</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"testing-and-benchmarking\" rel=\"next\">Testing and Benchmarking</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"embed\\\"\\u000A)\\u000A');codeLines.push('//go:embed folder/single_file.txt\\u000Avar fileString string\\u000A');codeLines.push('//go:embed folder/single_file.txt\\u000Avar fileByte []byte\\u000A');codeLines.push('//go:embed folder/single_file.txt\\u000A//go:embed folder/*.hash\\u000Avar folder embed.FS\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    print(fileString)\\u000A    print(string(fileByte))\\u000A');codeLines.push('    content1, _ :\\u003D folder.ReadFile(\\\"folder/file1.hash\\\")\\u000A    print(string(content1))\\u000A');codeLines.push('    content2, _ :\\u003D folder.ReadFile(\\\"folder/file2.hash\\\")\\u000A    print(string(content2))\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/enums",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Enums</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'interfaces';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'struct-embedding';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"enums\">\n      <h2><a href=\"./\">Go by Example</a>: Enums</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Enumerated types</em> (enums) are a special case of\n<a href=\"https://en.wikipedia.org/wiki/Algebraic_data_type\">sum types</a>.\nAn enum is a type that has a fixed number of possible\nvalues, each with a distinct name. Go doesn&rsquo;t have an\nenum type as a distinct language feature, but enums\nare simple to implement using existing language idioms.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/prQMptP_p1s\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Our enum type <code>ServerState</code> has an underlying <code>int</code> type.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">ServerState</span> <span class=\"kt\">int</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The possible values for <code>ServerState</code> are defined as\nconstants. The special keyword <a href=\"https://go.dev/ref/spec#Iota\">iota</a>\ngenerates successive constant values automatically; in this\ncase 0, 1, 2 and so on.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">const</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateIdle</span> <span class=\"nx\">ServerState</span> <span class=\"p\">=</span> <span class=\"kc\">iota</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateConnected</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateError</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateRetrying</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By implementing the <a href=\"https://pkg.go.dev/fmt#Stringer\">fmt.Stringer</a>\ninterface, values of <code>ServerState</code> can be printed out or converted\nto strings.</p>\n\n<p>This can get cumbersome if there are many possible values. In such\ncases the <a href=\"https://pkg.go.dev/golang.org/x/tools/cmd/stringer\">stringer tool</a>\ncan be used in conjunction with <code>go:generate</code> to automate the\nprocess. See <a href=\"https://eli.thegreenplace.net/2021/a-comprehensive-guide-to-go-generate\">this post</a>\nfor a longer explanation.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var</span> <span class=\"nx\">stateName</span> <span class=\"p\">=</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"nx\">ServerState</span><span class=\"p\">]</span><span class=\"kt\">string</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateIdle</span><span class=\"p\">:</span>      <span class=\"s\">&#34;idle&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateConnected</span><span class=\"p\">:</span> <span class=\"s\">&#34;connected&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateError</span><span class=\"p\">:</span>     <span class=\"s\">&#34;error&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">StateRetrying</span><span class=\"p\">:</span>  <span class=\"s\">&#34;retrying&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">ss</span> <span class=\"nx\">ServerState</span><span class=\"p\">)</span> <span class=\"nf\">String</span><span class=\"p\">()</span> <span class=\"kt\">string</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">stateName</span><span class=\"p\">[</span><span class=\"nx\">ss</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If we have a value of type <code>int</code>, we cannot pass it to <code>transition</code> - the\ncompiler will complain about type mismatch. This provides some degree of\ncompile-time type safety for enums.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ns</span> <span class=\"o\">:=</span> <span class=\"nf\">transition</span><span class=\"p\">(</span><span class=\"nx\">StateIdle</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">ns</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ns2</span> <span class=\"o\">:=</span> <span class=\"nf\">transition</span><span class=\"p\">(</span><span class=\"nx\">ns</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">ns2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>transition emulates a state transition for a\nserver; it takes the existing state and returns\na new state.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">transition</span><span class=\"p\">(</span><span class=\"nx\">s</span> <span class=\"nx\">ServerState</span><span class=\"p\">)</span> <span class=\"nx\">ServerState</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">switch</span> <span class=\"nx\">s</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">StateIdle</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">StateConnected</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">StateConnected</span><span class=\"p\">,</span> <span class=\"nx\">StateRetrying</span><span class=\"p\">:</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Suppose we check some predicates here to\ndetermine the next state&hellip;</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">StateIdle</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">StateError</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">StateError</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Errorf</span><span class=\"p\">(</span><span class=\"s\">&#34;unknown state: %s&#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run enums.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">connected\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">idle</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"struct-embedding\" rel=\"next\">Struct Embedding</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('type ServerState int\\u000A');codeLines.push('const (\\u000A    StateIdle ServerState \\u003D iota\\u000A    StateConnected\\u000A    StateError\\u000A    StateRetrying\\u000A)\\u000A');codeLines.push('var stateName \\u003D map[ServerState]string{\\u000A    StateIdle:      \\\"idle\\\",\\u000A    StateConnected: \\\"connected\\\",\\u000A    StateError:     \\\"error\\\",\\u000A    StateRetrying:  \\\"retrying\\\",\\u000A}\\u000A');codeLines.push('func (ss ServerState) String() string {\\u000A    return stateName[ss]\\u000A}\\u000A');codeLines.push('func main() {\\u000A    ns :\\u003D transition(StateIdle)\\u000A    fmt.Println(ns)\\u000A');codeLines.push('    ns2 :\\u003D transition(ns)\\u000A    fmt.Println(ns2)\\u000A}\\u000A');codeLines.push('func transition(s ServerState) ServerState {\\u000A    switch s {\\u000A    case StateIdle:\\u000A        return StateConnected\\u000A    case StateConnected, StateRetrying:\\u000A');codeLines.push('        return StateIdle\\u000A    case StateError:\\u000A        return StateError\\u000A    default:\\u000A        panic(fmt.Errorf(\\\"unknown state: %s\\\", s))\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/environment-variables",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Environment Variables</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'command-line-subcommands';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'logging';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"environment-variables\">\n      <h2><a href=\"./\">Go by Example</a>: Environment Variables</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"https://en.wikipedia.org/wiki/Environment_variable\">Environment variables</a>\nare a universal mechanism for <a href=\"https://www.12factor.net/config\">conveying configuration\ninformation to Unix programs</a>.\nLet&rsquo;s look at how to set, get, and list environment variables.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/2jmwXM264NC\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To set a key/value pair, use <code>os.Setenv</code>. To get a\nvalue for a key, use <code>os.Getenv</code>. This will return\nan empty string if the key isn&rsquo;t present in the\nenvironment.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Setenv</span><span class=\"p\">(</span><span class=\"s\">&#34;FOO&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;1&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;FOO:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Getenv</span><span class=\"p\">(</span><span class=\"s\">&#34;FOO&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;BAR:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Getenv</span><span class=\"p\">(</span><span class=\"s\">&#34;BAR&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>os.Environ</code> to list all key/value pairs in the\nenvironment. This returns a slice of strings in the\nform <code>KEY=value</code>. You can <code>strings.SplitN</code> them to\nget the key and value. Here we print all the keys.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">e</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Environ</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">pair</span> <span class=\"o\">:=</span> <span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">SplitN</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">,</span> <span class=\"s\">&#34;=&#34;</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">pair</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running the program shows that we pick up the value\nfor <code>FOO</code> that we set in the program, but that\n<code>BAR</code> is empty.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run environment-variables.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">FOO: 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">BAR: </span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The list of keys in the environment will depend on your\nparticular machine.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">TERM_PROGRAM\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">PATH\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">SHELL\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">...\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">FOO</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If we set <code>BAR</code> in the environment first, the running\nprogram picks that value up.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> BAR=2 go run environment-variables.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">FOO: 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">BAR: 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">...</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"logging\" rel=\"next\">Logging</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A    \\\"strings\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    os.Setenv(\\\"FOO\\\", \\\"1\\\")\\u000A    fmt.Println(\\\"FOO:\\\", os.Getenv(\\\"FOO\\\"))\\u000A    fmt.Println(\\\"BAR:\\\", os.Getenv(\\\"BAR\\\"))\\u000A');codeLines.push('    fmt.Println()\\u000A    for _, e :\\u003D range os.Environ() {\\u000A        pair :\\u003D strings.SplitN(e, \\\"\\u003D\\\", 2)\\u000A        fmt.Println(pair[0])\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/epoch",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Epoch</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'time';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'time-formatting-parsing';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"epoch\">\n      <h2><a href=\"./\">Go by Example</a>: Epoch</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A common requirement in programs is getting the number\nof seconds, milliseconds, or nanoseconds since the\n<a href=\"https://en.wikipedia.org/wiki/Unix_time\">Unix epoch</a>.\nHere&rsquo;s how to do it in Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/lRmD1EWHHPz\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>time.Now</code> with <code>Unix</code>, <code>UnixMilli</code> or <code>UnixNano</code>\nto get elapsed time since the Unix epoch in seconds,\nmilliseconds or nanoseconds, respectively.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">now</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">.</span><span class=\"nf\">Unix</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">.</span><span class=\"nf\">UnixMilli</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">.</span><span class=\"nf\">UnixNano</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also convert integer seconds or nanoseconds\nsince the epoch into the corresponding <code>time</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Unix</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">.</span><span class=\"nf\">Unix</span><span class=\"p\">(),</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Unix</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">now</span><span class=\"p\">.</span><span class=\"nf\">UnixNano</span><span class=\"p\">()))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run epoch.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2012-10-31 16:13:58.292387 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1351700038\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1351700038292\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1351700038292387000\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2012-10-31 16:13:58 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2012-10-31 16:13:58.292387 +0000 UTC</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at another time-related task: time\nparsing and formatting.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"time-formatting-parsing\" rel=\"next\">Time Formatting / Parsing</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    now :\\u003D time.Now()\\u000A    fmt.Println(now)\\u000A');codeLines.push('    fmt.Println(now.Unix())\\u000A    fmt.Println(now.UnixMilli())\\u000A    fmt.Println(now.UnixNano())\\u000A');codeLines.push('    fmt.Println(time.Unix(now.Unix(), 0))\\u000A    fmt.Println(time.Unix(0, now.UnixNano()))\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/errors",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Errors</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'range-over-iterators';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'custom-errors';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"errors\">\n      <h2><a href=\"./\">Go by Example</a>: Errors</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In Go it&rsquo;s idiomatic to communicate errors via an\nexplicit, separate return value. This contrasts with\nthe exceptions used in languages like Java, Python and\nRuby and the overloaded single result / error value\nsometimes used in C. Go&rsquo;s approach makes it easy to\nsee which functions return errors and to handle them\nusing the same language constructs employed for other,\nnon-error tasks.</p>\n\n<p>See the documentation of the <a href=\"https://pkg.go.dev/errors\">errors package</a>\nand <a href=\"https://go.dev/blog/go1.13-errors\">this blog post</a> for additional\ndetails.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/xWXAMmcrbTs\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;errors&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By convention, errors are the last return value and\nhave type <code>error</code>, a built-in interface.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"nx\">arg</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">arg</span> <span class=\"o\">==</span> <span class=\"mi\">42</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>errors.New</code> constructs a basic <code>error</code> value\nwith the given error message.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"s\">&#34;can&#39;t work with 42&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>nil</code> value in the error position indicates that\nthere was no error.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">arg</span> <span class=\"o\">+</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"kc\">nil</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A sentinel error is a predeclared variable that is used to\nsignify a specific error condition.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var</span> <span class=\"nx\">ErrOutOfTea</span> <span class=\"p\">=</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"s\">&#34;no more tea available&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var</span> <span class=\"nx\">ErrPower</span> <span class=\"p\">=</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"s\">&#34;can&#39;t boil water&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">makeTea</span><span class=\"p\">(</span><span class=\"nx\">arg</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">error</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">arg</span> <span class=\"o\">==</span> <span class=\"mi\">2</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">ErrOutOfTea</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"k\">if</span> <span class=\"nx\">arg</span> <span class=\"o\">==</span> <span class=\"mi\">4</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can wrap errors with higher-level errors to add\ncontext. The simplest way to do this is with the\n<code>%w</code> verb in <code>fmt.Errorf</code>. Wrapped errors\ncreate a logical chain (A wraps B, which wraps C, etc.)\nthat can be queried with functions like <code>errors.Is</code>\nand <code>errors.AsType</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Errorf</span><span class=\"p\">(</span><span class=\"s\">&#34;making tea: %w&#34;</span><span class=\"p\">,</span> <span class=\"nx\">ErrPower</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"kc\">nil</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"p\">[]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">42</span><span class=\"p\">}</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It&rsquo;s idiomatic to use an inline error check in the <code>if</code>\nline.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">r</span><span class=\"p\">,</span> <span class=\"nx\">e</span> <span class=\"o\">:=</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">);</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;f failed:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;f worked:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">5</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nf\">makeTea</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">);</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>errors.Is</code> checks that a given error (or any error in its chain)\nmatches a specific error value. This is especially useful with wrapped or\nnested errors, allowing you to identify specific error types or sentinel\nerrors in a chain of errors.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">            <span class=\"k\">if</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nf\">Is</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">,</span> <span class=\"nx\">ErrOutOfTea</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;We should buy new tea!&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"k\">if</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nf\">Is</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">,</span> <span class=\"nx\">ErrPower</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Now it is dark.&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;unknown error: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">continue</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Tea is ready!&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run errors.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">f worked: 10\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">f failed: can&#39;t work with 42\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tea is ready!\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tea is ready!\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">We should buy new tea!\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tea is ready!\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Now it is dark.</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"custom-errors\" rel=\"next\">Custom Errors</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"errors\\\"\\u000A    \\\"fmt\\\"\\u000A)\\u000A');codeLines.push('func f(arg int) (int, error) {\\u000A    if arg \\u003D\\u003D 42 {\\u000A');codeLines.push('        return -1, errors.New(\\\"can\\'t work with 42\\\")\\u000A    }\\u000A');codeLines.push('    return arg + 3, nil\\u000A}\\u000A');codeLines.push('var ErrOutOfTea \\u003D errors.New(\\\"no more tea available\\\")\\u000Avar ErrPower \\u003D errors.New(\\\"can\\'t boil water\\\")\\u000A');codeLines.push('func makeTea(arg int) error {\\u000A    if arg \\u003D\\u003D 2 {\\u000A        return ErrOutOfTea\\u000A    } else if arg \\u003D\\u003D 4 {\\u000A');codeLines.push('        return fmt.Errorf(\\\"making tea: %w\\\", ErrPower)\\u000A    }\\u000A    return nil\\u000A}\\u000A');codeLines.push('func main() {\\u000A    for _, i :\\u003D range []int{7, 42} {\\u000A');codeLines.push('        if r, e :\\u003D f(i); e !\\u003D nil {\\u000A            fmt.Println(\\\"f failed:\\\", e)\\u000A        } else {\\u000A            fmt.Println(\\\"f worked:\\\", r)\\u000A        }\\u000A    }\\u000A');codeLines.push('    for i :\\u003D range 5 {\\u000A        if err :\\u003D makeTea(i); err !\\u003D nil {\\u000A');codeLines.push('            if errors.Is(err, ErrOutOfTea) {\\u000A                fmt.Println(\\\"We should buy new tea!\\\")\\u000A            } else if errors.Is(err, ErrPower) {\\u000A                fmt.Println(\\\"Now it is dark.\\\")\\u000A            } else {\\u000A                fmt.Printf(\\\"unknown error: %s\\\\n\\\", err)\\u000A            }\\u000A            continue\\u000A        }\\u000A');codeLines.push('        fmt.Println(\\\"Tea is ready!\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/execing-processes",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Exec'ing Processes</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'spawning-processes';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'signals';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"execing-processes\">\n      <h2><a href=\"./\">Go by Example</a>: Exec'ing Processes</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In the previous example we looked at\n<a href=\"spawning-processes\">spawning external processes</a>. We\ndo this when we need an external process accessible to\na running Go process. Sometimes we just want to\ncompletely replace the current Go process with another\n(perhaps non-Go) one. To do this we&rsquo;ll use Go&rsquo;s\nimplementation of the classic\n<a href=\"https://en.wikipedia.org/wiki/Exec_(operating_system)\"><code>exec</code></a>\nfunction.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/s9qg7olf1dM\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os/exec&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;syscall&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For our example we&rsquo;ll exec <code>ls</code>. Go requires an\nabsolute path to the binary we want to execute, so\nwe&rsquo;ll use <code>exec.LookPath</code> to find it (probably\n<code>/bin/ls</code>).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">binary</span><span class=\"p\">,</span> <span class=\"nx\">lookErr</span> <span class=\"o\">:=</span> <span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nf\">LookPath</span><span class=\"p\">(</span><span class=\"s\">&#34;ls&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">lookErr</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">lookErr</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Exec</code> requires arguments in slice form (as\nopposed to one big string). We&rsquo;ll give <code>ls</code> a few\ncommon arguments. Note that the first argument should\nbe the program name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">args</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;ls&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-a&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-l&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-h&#34;</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Exec</code> also needs a set of <a href=\"environment-variables\">environment variables</a>\nto use. Here we just provide our current\nenvironment.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">env</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Environ</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s the actual <code>syscall.Exec</code> call. If this call is\nsuccessful, the execution of our process will end\nhere and be replaced by the <code>/bin/ls -a -l -h</code>\nprocess. If there is an error we&rsquo;ll get a return\nvalue.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">execErr</span> <span class=\"o\">:=</span> <span class=\"nx\">syscall</span><span class=\"p\">.</span><span class=\"nf\">Exec</span><span class=\"p\">(</span><span class=\"nx\">binary</span><span class=\"p\">,</span> <span class=\"nx\">args</span><span class=\"p\">,</span> <span class=\"nx\">env</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">execErr</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">execErr</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When we run our program it is replaced by <code>ls</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run execing-processes.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">total 16\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">drwxr-xr-x  4 mark 136B Oct 3 16:29 .\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">-rw-r--r--  1 mark 1.3K Oct 3 16:28 execing-processes.go</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that Go does not offer a classic Unix <code>fork</code>\nfunction. Usually this isn&rsquo;t an issue though, since\nstarting goroutines, spawning processes, and exec&rsquo;ing\nprocesses covers most use cases for <code>fork</code>.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"signals\" rel=\"next\">Signals</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"os\\\"\\u000A    \\\"os/exec\\\"\\u000A    \\\"syscall\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    binary, lookErr :\\u003D exec.LookPath(\\\"ls\\\")\\u000A    if lookErr !\\u003D nil {\\u000A        panic(lookErr)\\u000A    }\\u000A');codeLines.push('    args :\\u003D []string{\\\"ls\\\", \\\"-a\\\", \\\"-l\\\", \\\"-h\\\"}\\u000A');codeLines.push('    env :\\u003D os.Environ()\\u000A');codeLines.push('    execErr :\\u003D syscall.Exec(binary, args, env)\\u000A    if execErr !\\u003D nil {\\u000A        panic(execErr)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/exit",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Exit</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'signals';\n          }\n          \n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"exit\">\n      <h2><a href=\"./\">Go by Example</a>: Exit</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>os.Exit</code> to immediately exit with a given\nstatus.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/b9aYzlENkb__R\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>defer</code>s will <em>not</em> be run when using <code>os.Exit</code>, so\nthis <code>fmt.Println</code> will never be called.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;!&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Exit with status 3.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Exit</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that unlike e.g. C, Go does not use an integer\nreturn value from <code>main</code> to indicate exit status. If\nyou&rsquo;d like to exit with a non-zero status you should\nuse <code>os.Exit</code>.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you run <code>exit.go</code> using <code>go run</code>, the exit\nwill be picked up by <code>go</code> and printed.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run exit.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">exit status 3</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By building and executing a binary you can see\nthe status in the terminal.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go build exit.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./exit\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo $?\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">3</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that the <code>!</code> from our program never got printed.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    defer fmt.Println(\\\"!\\\")\\u000A');codeLines.push('    os.Exit(3)\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/file-paths",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: File Paths</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'line-filters';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'directories';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"file-paths\">\n      <h2><a href=\"./\">Go by Example</a>: File Paths</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>filepath</code> package provides functions to parse\nand construct <em>file paths</em> in a way that is portable\nbetween operating systems; <code>dir/file</code> on Linux vs.\n<code>dir\\file</code> on Windows, for example.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/5h3lUytvmyO\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Join</code> should be used to construct paths in a\nportable way. It takes any number of arguments\nand constructs a hierarchical path from them.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"s\">&#34;dir1&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;dir2&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;filename&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;p:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You should always use <code>Join</code> instead of\nconcatenating <code>/</code>s or <code>\\</code>s manually. In addition\nto providing portability, <code>Join</code> will also\nnormalize paths by removing superfluous separators\nand directory changes.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"s\">&#34;dir1//&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;filename&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"s\">&#34;dir1/../dir1&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;filename&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Dir</code> and <code>Base</code> can be used to split a path to the\ndirectory and the file. Alternatively, <code>Split</code> will\nreturn both in the same call.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Dir(p):&#34;</span><span class=\"p\">,</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Dir</span><span class=\"p\">(</span><span class=\"nx\">p</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Base(p):&#34;</span><span class=\"p\">,</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Base</span><span class=\"p\">(</span><span class=\"nx\">p</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can check whether a path is absolute.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">IsAbs</span><span class=\"p\">(</span><span class=\"s\">&#34;dir/file&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">IsAbs</span><span class=\"p\">(</span><span class=\"s\">&#34;/dir/file&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">filename</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;config.json&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Some file names have extensions following a dot. We\ncan split the extension out of such names with <code>Ext</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ext</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Ext</span><span class=\"p\">(</span><span class=\"nx\">filename</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">ext</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To find the file&rsquo;s name with the extension removed,\nuse <code>strings.TrimSuffix</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">TrimSuffix</span><span class=\"p\">(</span><span class=\"nx\">filename</span><span class=\"p\">,</span> <span class=\"nx\">ext</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Rel</code> finds a relative path between a <em>base</em> and a\n<em>target</em>. It returns an error if the target cannot\nbe made relative to base.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">rel</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Rel</span><span class=\"p\">(</span><span class=\"s\">&#34;a/b&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;a/b/t/file&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">rel</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">rel</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Rel</span><span class=\"p\">(</span><span class=\"s\">&#34;a/b&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;a/c/t/file&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">rel</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run file-paths.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">p: dir1/dir2/filename\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">dir1/filename\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">dir1/filename\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Dir(p): dir1/dir2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Base(p): filename\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">.json\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">config\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">t/file\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">../c/t/file</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"directories\" rel=\"next\">Directories</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"path/filepath\\\"\\u000A    \\\"strings\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    p :\\u003D filepath.Join(\\\"dir1\\\", \\\"dir2\\\", \\\"filename\\\")\\u000A    fmt.Println(\\\"p:\\\", p)\\u000A');codeLines.push('    fmt.Println(filepath.Join(\\\"dir1//\\\", \\\"filename\\\"))\\u000A    fmt.Println(filepath.Join(\\\"dir1/../dir1\\\", \\\"filename\\\"))\\u000A');codeLines.push('    fmt.Println(\\\"Dir(p):\\\", filepath.Dir(p))\\u000A    fmt.Println(\\\"Base(p):\\\", filepath.Base(p))\\u000A');codeLines.push('    fmt.Println(filepath.IsAbs(\\\"dir/file\\\"))\\u000A    fmt.Println(filepath.IsAbs(\\\"/dir/file\\\"))\\u000A');codeLines.push('    filename :\\u003D \\\"config.json\\\"\\u000A');codeLines.push('    ext :\\u003D filepath.Ext(filename)\\u000A    fmt.Println(ext)\\u000A');codeLines.push('    fmt.Println(strings.TrimSuffix(filename, ext))\\u000A');codeLines.push('    rel, err :\\u003D filepath.Rel(\\\"a/b\\\", \\\"a/b/t/file\\\")\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    fmt.Println(rel)\\u000A');codeLines.push('    rel, err \\u003D filepath.Rel(\\\"a/b\\\", \\\"a/c/t/file\\\")\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    fmt.Println(rel)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/for",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: For</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'constants';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'if-else';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"for\">\n      <h2><a href=\"./\">Go by Example</a>: For</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>for</code> is Go&rsquo;s only looping construct. Here are\nsome basic types of <code>for</code> loops.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/_F2rYHNilKa\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The most basic type, with a single condition.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">i</span> <span class=\"p\">=</span> <span class=\"nx\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A classic initial/condition/after <code>for</code> loop.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">j</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">j</span> <span class=\"p\">&lt;</span> <span class=\"mi\">3</span><span class=\"p\">;</span> <span class=\"nx\">j</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">j</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Another way of accomplishing the basic &ldquo;do this\nN times&rdquo; iteration is <code>range</code> over an integer.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;range&#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>for</code> without a condition will loop repeatedly\nuntil you <code>break</code> out of the loop or <code>return</code> from\nthe enclosing function.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;loop&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">break</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also <code>continue</code> to the next iteration of\nthe loop.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">n</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">6</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">n</span><span class=\"o\">%</span><span class=\"mi\">2</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">continue</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run for.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">range 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">range 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">range 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">loop\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll see some other <code>for</code> forms later when we look at\n<code>range</code> statements, channels, and other data\nstructures.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"if-else\" rel=\"next\">If/Else</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    i :\\u003D 1\\u000A    for i \\u003C\\u003D 3 {\\u000A        fmt.Println(i)\\u000A        i \\u003D i + 1\\u000A    }\\u000A');codeLines.push('    for j :\\u003D 0; j \\u003C 3; j++ {\\u000A        fmt.Println(j)\\u000A    }\\u000A');codeLines.push('    for i :\\u003D range 3 {\\u000A        fmt.Println(\\\"range\\\", i)\\u000A    }\\u000A');codeLines.push('    for {\\u000A        fmt.Println(\\\"loop\\\")\\u000A        break\\u000A    }\\u000A');codeLines.push('    for n :\\u003D range 6 {\\u000A        if n%2 \\u003D\\u003D 0 {\\u000A            continue\\u000A        }\\u000A        fmt.Println(n)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/functions",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Functions</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'maps';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'multiple-return-values';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"functions\">\n      <h2><a href=\"./\">Go by Example</a>: Functions</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Functions</em> are central in Go. We&rsquo;ll learn about\nfunctions with a few different examples.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/-o49-dQfGbK\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a function that takes two <code>int</code>s and returns\ntheir sum as an <code>int</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">plus</span><span class=\"p\">(</span><span class=\"nx\">a</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go requires explicit returns, i.e. it won&rsquo;t\nautomatically return the value of the last\nexpression.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">a</span> <span class=\"o\">+</span> <span class=\"nx\">b</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When you have multiple consecutive parameters of\nthe same type, you may omit the type name for the\nlike-typed parameters up to the final parameter that\ndeclares the type.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">plusPlus</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span><span class=\"p\">,</span> <span class=\"nx\">c</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">a</span> <span class=\"o\">+</span> <span class=\"nx\">b</span> <span class=\"o\">+</span> <span class=\"nx\">c</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Call a function just as you&rsquo;d expect, with\n<code>name(args)</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res</span> <span class=\"o\">:=</span> <span class=\"nf\">plus</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;1+2 =&#34;</span><span class=\"p\">,</span> <span class=\"nx\">res</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res</span> <span class=\"p\">=</span> <span class=\"nf\">plusPlus</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;1+2+3 =&#34;</span><span class=\"p\">,</span> <span class=\"nx\">res</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run functions.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1+2 = 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1+2+3 = 6</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>There are several other features to Go functions. One is\nmultiple return values, which we&rsquo;ll look at next.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"multiple-return-values\" rel=\"next\">Multiple Return Values</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func plus(a int, b int) int {\\u000A');codeLines.push('    return a + b\\u000A}\\u000A');codeLines.push('func plusPlus(a, b, c int) int {\\u000A    return a + b + c\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    res :\\u003D plus(1, 2)\\u000A    fmt.Println(\\\"1+2 \\u003D\\\", res)\\u000A');codeLines.push('    res \\u003D plusPlus(1, 2, 3)\\u000A    fmt.Println(\\\"1+2+3 \\u003D\\\", res)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/generics",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Generics</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'struct-embedding';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'range-over-iterators';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"generics\">\n      <h2><a href=\"./\">Go by Example</a>: Generics</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Starting with version 1.18, Go has added support for\n<em>generics</em>, also known as <em>type parameters</em>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/7v7vElzhAeO\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>As an example of a generic function, <code>SlicesIndex</code> takes\na slice of any <code>comparable</code> type and an element of that\ntype and returns the index of the first occurrence of\nv in s, or -1 if not present. The <code>comparable</code> constraint\nmeans that we can compare values of this type with the\n<code>==</code> and <code>!=</code> operators. For a more thorough explanation\nof this type signature, see <a href=\"https://go.dev/blog/deconstructing-type-parameters\">this blog post</a>.\nNote that this function exists in the standard library\nas <a href=\"https://pkg.go.dev/slices#Index\">slices.Index</a>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nx\">SlicesIndex</span><span class=\"p\">[</span><span class=\"nx\">S</span> <span class=\"err\">~</span><span class=\"p\">[]</span><span class=\"nx\">E</span><span class=\"p\">,</span> <span class=\"nx\">E</span> <span class=\"nx\">comparable</span><span class=\"p\">](</span><span class=\"nx\">s</span> <span class=\"nx\">S</span><span class=\"p\">,</span> <span class=\"nx\">v</span> <span class=\"nx\">E</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">s</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">v</span> <span class=\"o\">==</span> <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">]</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">return</span> <span class=\"nx\">i</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"mi\">1</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>As an example of a generic type, <code>List</code> is a\nsingly-linked list with values of any type.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"nx\">T</span> <span class=\"nx\">any</span><span class=\"p\">]</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">head</span><span class=\"p\">,</span> <span class=\"nx\">tail</span> <span class=\"o\">*</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span> <span class=\"nx\">any</span><span class=\"p\">]</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">next</span> <span class=\"o\">*</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">val</span>  <span class=\"nx\">T</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can define methods on generic types just like we\ndo on regular types, but we have to keep the type\nparameters in place. The type is <code>List[T]</code>, not <code>List</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">lst</span> <span class=\"o\">*</span><span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">])</span> <span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"nx\">v</span> <span class=\"nx\">T</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span> <span class=\"o\">==</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">head</span> <span class=\"p\">=</span> <span class=\"o\">&amp;</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]{</span><span class=\"nx\">val</span><span class=\"p\">:</span> <span class=\"nx\">v</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span> <span class=\"p\">=</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">head</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span><span class=\"p\">.</span><span class=\"nx\">next</span> <span class=\"p\">=</span> <span class=\"o\">&amp;</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]{</span><span class=\"nx\">val</span><span class=\"p\">:</span> <span class=\"nx\">v</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span> <span class=\"p\">=</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span><span class=\"p\">.</span><span class=\"nx\">next</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>AllElements returns all the List elements as a slice.\nIn the next example we&rsquo;ll see a more idiomatic way\nof iterating over all elements of custom types.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">lst</span> <span class=\"o\">*</span><span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">])</span> <span class=\"nf\">AllElements</span><span class=\"p\">()</span> <span class=\"p\">[]</span><span class=\"nx\">T</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">elems</span> <span class=\"p\">[]</span><span class=\"nx\">T</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">e</span> <span class=\"o\">:=</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">head</span><span class=\"p\">;</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span><span class=\"p\">;</span> <span class=\"nx\">e</span> <span class=\"p\">=</span> <span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nx\">next</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">elems</span> <span class=\"p\">=</span> <span class=\"nb\">append</span><span class=\"p\">(</span><span class=\"nx\">elems</span><span class=\"p\">,</span> <span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nx\">val</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">elems</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">s</span> <span class=\"p\">=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;bar&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;zoo&#34;</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When invoking generic functions, we can often rely\non <em>type inference</em>. Note that we don&rsquo;t have to\nspecify the types for <code>S</code> and <code>E</code> when\ncalling <code>SlicesIndex</code> - the compiler infers them\nautomatically.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;index of zoo:&#34;</span><span class=\"p\">,</span> <span class=\"nf\">SlicesIndex</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">,</span> <span class=\"s\">&#34;zoo&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>&hellip; though we could also specify them explicitly.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span> <span class=\"p\">=</span> <span class=\"nx\">SlicesIndex</span><span class=\"p\">[[]</span><span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"kt\">string</span><span class=\"p\">](</span><span class=\"nx\">s</span><span class=\"p\">,</span> <span class=\"s\">&#34;zoo&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span> <span class=\"o\">:=</span> <span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"kt\">int</span><span class=\"p\">]{}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"mi\">13</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"mi\">23</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;list:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">AllElements</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run generics.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">index of zoo: 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">list: [10 13 23]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"range-over-iterators\" rel=\"next\">Range over Iterators</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func SlicesIndex[S ~[]E, E comparable](s S, v E) int {\\u000A    for i :\\u003D range s {\\u000A        if v \\u003D\\u003D s[i] {\\u000A            return i\\u000A        }\\u000A    }\\u000A    return -1\\u000A}\\u000A');codeLines.push('type List[T any] struct {\\u000A    head, tail *element[T]\\u000A}\\u000A');codeLines.push('type element[T any] struct {\\u000A    next *element[T]\\u000A    val  T\\u000A}\\u000A');codeLines.push('func (lst *List[T]) Push(v T) {\\u000A    if lst.tail \\u003D\\u003D nil {\\u000A        lst.head \\u003D \\u0026element[T]{val: v}\\u000A        lst.tail \\u003D lst.head\\u000A    } else {\\u000A        lst.tail.next \\u003D \\u0026element[T]{val: v}\\u000A        lst.tail \\u003D lst.tail.next\\u000A    }\\u000A}\\u000A');codeLines.push('func (lst *List[T]) AllElements() []T {\\u000A    var elems []T\\u000A    for e :\\u003D lst.head; e !\\u003D nil; e \\u003D e.next {\\u000A        elems \\u003D append(elems, e.val)\\u000A    }\\u000A    return elems\\u000A}\\u000A');codeLines.push('func main() {\\u000A    var s \\u003D []string{\\\"foo\\\", \\\"bar\\\", \\\"zoo\\\"}\\u000A');codeLines.push('    fmt.Println(\\\"index of zoo:\\\", SlicesIndex(s, \\\"zoo\\\"))\\u000A');codeLines.push('    _ \\u003D SlicesIndex[[]string, string](s, \\\"zoo\\\")\\u000A');codeLines.push('    lst :\\u003D List[int]{}\\u000A    lst.Push(10)\\u000A    lst.Push(13)\\u000A    lst.Push(23)\\u000A    fmt.Println(\\\"list:\\\", lst.AllElements())\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/goroutines",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Goroutines</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'custom-errors';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'channels';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"goroutines\">\n      <h2><a href=\"./\">Go by Example</a>: Goroutines</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <em>goroutine</em> is a lightweight thread of execution.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/0fx_WokYVFO\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"nx\">from</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">from</span><span class=\"p\">,</span> <span class=\"s\">&#34;:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Suppose we have a function call <code>f(s)</code>. Here&rsquo;s how\nwe&rsquo;d call that in the usual way, running it\nsynchronously.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"s\">&#34;direct&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To invoke this function in a goroutine, use\n<code>go f(s)</code>. This new goroutine will execute\nconcurrently with the calling one.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"s\">&#34;goroutine&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also start a goroutine for an anonymous\nfunction call.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">msg</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">msg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}(</span><span class=\"s\">&#34;going&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Our two function calls are running asynchronously in\nseparate goroutines now. Wait for them to finish\n(for a more robust approach, use a <a href=\"waitgroups\">WaitGroup</a>).</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;done&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When we run this program, we see the output of the\nblocking call first, then the output of the two\ngoroutines. The goroutines&rsquo; output may be interleaved,\nbecause goroutines are being run concurrently by the\nGo runtime.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run goroutines.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">direct : 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">direct : 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">direct : 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">goroutine : 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">going\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">goroutine : 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">goroutine : 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">done</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at a complement to goroutines in\nconcurrent Go programs: channels.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"channels\" rel=\"next\">Channels</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func f(from string) {\\u000A    for i :\\u003D range 3 {\\u000A        fmt.Println(from, \\\":\\\", i)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    f(\\\"direct\\\")\\u000A');codeLines.push('    go f(\\\"goroutine\\\")\\u000A');codeLines.push('    go func(msg string) {\\u000A        fmt.Println(msg)\\u000A    }(\\\"going\\\")\\u000A');codeLines.push('    time.Sleep(time.Second)\\u000A    fmt.Println(\\\"done\\\")\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/hello-world",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Hello World</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'values';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"hello-world\">\n      <h2><a href=\"./\">Go by Example</a>: Hello World</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Our first program will print the classic &ldquo;hello world&rdquo;\nmessage. Here&rsquo;s the full source code.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/NeviD0awXjt\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;hello world&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To run the program, put the code in <code>hello-world.go</code> and\nuse <code>go run</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run hello-world.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello world</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sometimes we&rsquo;ll want to build our programs into\nbinaries. We can do this using <code>go build</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go build hello-world.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ls\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello-world    hello-world.go</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can then execute the built binary directly.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> ./hello-world\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello world</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now that we can run and build basic Go programs, let&rsquo;s\nlearn more about the language.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"values\" rel=\"next\">Values</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A    fmt.Println(\\\"hello world\\\")\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/http-client",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: HTTP Client</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'logging';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'http-server';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"http-client\">\n      <h2><a href=\"./\">Go by Example</a>: HTTP Client</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The Go standard library comes with excellent support\nfor HTTP clients and servers in the <code>net/http</code>\npackage. In this example we&rsquo;ll use it to issue simple\nHTTP requests.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/vFW_el7oHMk\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bufio&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;net/http&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Issue an HTTP GET request to a server. <code>http.Get</code> is a\nconvenient shortcut around creating an <code>http.Client</code>\nobject and calling its <code>Get</code> method; it uses the\n<code>http.DefaultClient</code> object which has useful default\nsettings.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">resp</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">Get</span><span class=\"p\">(</span><span class=\"s\">&#34;https://gobyexample.com&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">resp</span><span class=\"p\">.</span><span class=\"nx\">Body</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Print the HTTP response status.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Response status:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">resp</span><span class=\"p\">.</span><span class=\"nx\">Status</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Print the first 5 lines of the response body.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">scanner</span> <span class=\"o\">:=</span> <span class=\"nx\">bufio</span><span class=\"p\">.</span><span class=\"nf\">NewScanner</span><span class=\"p\">(</span><span class=\"nx\">resp</span><span class=\"p\">.</span><span class=\"nx\">Body</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">scanner</span><span class=\"p\">.</span><span class=\"nf\">Scan</span><span class=\"p\">()</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">i</span> <span class=\"p\">&lt;</span> <span class=\"mi\">5</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">scanner</span><span class=\"p\">.</span><span class=\"nf\">Text</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">scanner</span><span class=\"p\">.</span><span class=\"nf\">Err</span><span class=\"p\">();</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run http-clients.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Response status: 200 OK\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">&lt;!DOCTYPE html&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">&lt;html&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">  &lt;head&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    &lt;meta charset=&#34;utf-8&#34;&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    &lt;title&gt;Go by Example&lt;/title&gt;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"http-server\" rel=\"next\">HTTP Server</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bufio\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"net/http\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    resp, err :\\u003D http.Get(\\\"https://gobyexample.com\\\")\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    defer resp.Body.Close()\\u000A');codeLines.push('    fmt.Println(\\\"Response status:\\\", resp.Status)\\u000A');codeLines.push('    scanner :\\u003D bufio.NewScanner(resp.Body)\\u000A    for i :\\u003D 0; scanner.Scan() \\u0026\\u0026 i \\u003C 5; i++ {\\u000A        fmt.Println(scanner.Text())\\u000A    }\\u000A');codeLines.push('    if err :\\u003D scanner.Err(); err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/http-server",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: HTTP Server</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'http-client';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'tcp-server';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"http-server\">\n      <h2><a href=\"./\">Go by Example</a>: HTTP Server</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Writing a basic HTTP server is easy using the\n<code>net/http</code> package.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/s3xMMt9Ytry\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;net/http&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A fundamental concept in <code>net/http</code> servers is\n<em>handlers</em>. A handler is an object implementing the\n<code>http.Handler</code> interface. A common way to write\na handler is by using the <code>http.HandlerFunc</code> adapter\non functions with the appropriate signature.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">hello</span><span class=\"p\">(</span><span class=\"nx\">w</span> <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">ResponseWriter</span><span class=\"p\">,</span> <span class=\"nx\">req</span> <span class=\"o\">*</span><span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">Request</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Functions serving as handlers take a\n<code>http.ResponseWriter</code> and a <code>http.Request</code> as\narguments. The response writer is used to fill in the\nHTTP response. Here our simple response is just\n&ldquo;hello\\n&rdquo;.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Fprintf</span><span class=\"p\">(</span><span class=\"nx\">w</span><span class=\"p\">,</span> <span class=\"s\">&#34;hello\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">headers</span><span class=\"p\">(</span><span class=\"nx\">w</span> <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">ResponseWriter</span><span class=\"p\">,</span> <span class=\"nx\">req</span> <span class=\"o\">*</span><span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nx\">Request</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This handler does something a little more\nsophisticated by reading all the HTTP request\nheaders and echoing them into the response body.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">name</span><span class=\"p\">,</span> <span class=\"nx\">headers</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">req</span><span class=\"p\">.</span><span class=\"nx\">Header</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">h</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">headers</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Fprintf</span><span class=\"p\">(</span><span class=\"nx\">w</span><span class=\"p\">,</span> <span class=\"s\">&#34;%v: %v\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">name</span><span class=\"p\">,</span> <span class=\"nx\">h</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We register our handlers on server routes using the\n<code>http.HandleFunc</code> convenience function. It sets up\nthe <em>default router</em> in the <code>net/http</code> package and\ntakes a function as an argument.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">HandleFunc</span><span class=\"p\">(</span><span class=\"s\">&#34;/hello&#34;</span><span class=\"p\">,</span> <span class=\"nx\">hello</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">HandleFunc</span><span class=\"p\">(</span><span class=\"s\">&#34;/headers&#34;</span><span class=\"p\">,</span> <span class=\"nx\">headers</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Finally, we call the <code>ListenAndServe</code> with the port\nand a handler. <code>nil</code> tells it to use the default\nrouter we&rsquo;ve just set up.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">http</span><span class=\"p\">.</span><span class=\"nf\">ListenAndServe</span><span class=\"p\">(</span><span class=\"s\">&#34;:8090&#34;</span><span class=\"p\">,</span> <span class=\"kc\">nil</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Run the server in the background.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run http-server.go &amp;</span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Access the <code>/hello</code> route.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> curl localhost:8090/hello\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"tcp-server\" rel=\"next\">TCP Server</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"net/http\\\"\\u000A)\\u000A');codeLines.push('func hello(w http.ResponseWriter, req *http.Request) {\\u000A');codeLines.push('    fmt.Fprintf(w, \\\"hello\\\\n\\\")\\u000A}\\u000A');codeLines.push('func headers(w http.ResponseWriter, req *http.Request) {\\u000A');codeLines.push('    for name, headers :\\u003D range req.Header {\\u000A        for _, h :\\u003D range headers {\\u000A            fmt.Fprintf(w, \\\"%v: %v\\\\n\\\", name, h)\\u000A        }\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    http.HandleFunc(\\\"/hello\\\", hello)\\u000A    http.HandleFunc(\\\"/headers\\\", headers)\\u000A');codeLines.push('    http.ListenAndServe(\\\":8090\\\", nil)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/if-else",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: If/Else</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'for';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'switch';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"if-else\">\n      <h2><a href=\"./\">Go by Example</a>: If/Else</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Branching with <code>if</code> and <code>else</code> in Go is\nstraight-forward.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/RKgKzCe7qcF\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a basic example.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"mi\">7</span><span class=\"o\">%</span><span class=\"mi\">2</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;7 is even&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;7 is odd&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can have an <code>if</code> statement without an else.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"mi\">8</span><span class=\"o\">%</span><span class=\"mi\">4</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;8 is divisible by 4&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Logical operators like <code>&amp;&amp;</code> and <code>||</code> are often\nuseful in conditions.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"mi\">8</span><span class=\"o\">%</span><span class=\"mi\">2</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"o\">||</span> <span class=\"mi\">7</span><span class=\"o\">%</span><span class=\"mi\">2</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;either 8 or 7 are even&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A statement can precede conditionals; any variables\ndeclared in this statement are available in the current\nand all subsequent branches.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">num</span> <span class=\"o\">:=</span> <span class=\"mi\">9</span><span class=\"p\">;</span> <span class=\"nx\">num</span> <span class=\"p\">&lt;</span> <span class=\"mi\">0</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">num</span><span class=\"p\">,</span> <span class=\"s\">&#34;is negative&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"k\">if</span> <span class=\"nx\">num</span> <span class=\"p\">&lt;</span> <span class=\"mi\">10</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">num</span><span class=\"p\">,</span> <span class=\"s\">&#34;has 1 digit&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">num</span><span class=\"p\">,</span> <span class=\"s\">&#34;has multiple digits&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that you don&rsquo;t need parentheses around conditions\nin Go, but that the braces are required.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run if-else.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">7 is odd\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">8 is divisible by 4\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">either 8 or 7 are even\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">9 has 1 digit</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>There is no <a href=\"https://en.wikipedia.org/wiki/%3F:\">ternary if</a>\nin Go, so you&rsquo;ll need to use a full <code>if</code> statement even\nfor basic conditions.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"switch\" rel=\"next\">Switch</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    if 7%2 \\u003D\\u003D 0 {\\u000A        fmt.Println(\\\"7 is even\\\")\\u000A    } else {\\u000A        fmt.Println(\\\"7 is odd\\\")\\u000A    }\\u000A');codeLines.push('    if 8%4 \\u003D\\u003D 0 {\\u000A        fmt.Println(\\\"8 is divisible by 4\\\")\\u000A    }\\u000A');codeLines.push('    if 8%2 \\u003D\\u003D 0 || 7%2 \\u003D\\u003D 0 {\\u000A        fmt.Println(\\\"either 8 or 7 are even\\\")\\u000A    }\\u000A');codeLines.push('    if num :\\u003D 9; num \\u003C 0 {\\u000A        fmt.Println(num, \\\"is negative\\\")\\u000A    } else if num \\u003C 10 {\\u000A        fmt.Println(num, \\\"has 1 digit\\\")\\u000A    } else {\\u000A        fmt.Println(num, \\\"has multiple digits\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <body>\n    <div id=\"intro\">\n      <h2><a href=\"./\">Go by Example</a></h2>\n      <p>\n        <a href=\"https://go.dev\">Go</a> is an\n        open source programming language designed for\n        building scalable, secure and reliable software.\n        Please read the\n        <a href=\"https://go.dev/doc/tutorial/getting-started\">official documentation</a>\n        to learn more.\n      </p>\n\n      <p>\n        <em>Go by Example</em> is a hands-on introduction\n        to Go using annotated example programs. Check out\n        the <a href=\"hello-world\">first example</a> or\n        browse the full list below.\n      </p>\n\n      <p>\n        Unless stated otherwise, examples here assume the\n        <a href=\"https://go.dev/doc/devel/release\">latest major release Go</a>\n        and may use new language features. Try to upgrade to the latest\n        version if something isn't working.\n      </p>\n\n      <ul>\n      \n        <li><a href=\"hello-world\">Hello World</a></li>\n      \n        <li><a href=\"values\">Values</a></li>\n      \n        <li><a href=\"variables\">Variables</a></li>\n      \n        <li><a href=\"constants\">Constants</a></li>\n      \n        <li><a href=\"for\">For</a></li>\n      \n        <li><a href=\"if-else\">If/Else</a></li>\n      \n        <li><a href=\"switch\">Switch</a></li>\n      \n        <li><a href=\"arrays\">Arrays</a></li>\n      \n        <li><a href=\"slices\">Slices</a></li>\n      \n        <li><a href=\"maps\">Maps</a></li>\n      \n        <li><a href=\"functions\">Functions</a></li>\n      \n        <li><a href=\"multiple-return-values\">Multiple Return Values</a></li>\n      \n        <li><a href=\"variadic-functions\">Variadic Functions</a></li>\n      \n        <li><a href=\"closures\">Closures</a></li>\n      \n        <li><a href=\"recursion\">Recursion</a></li>\n      \n        <li><a href=\"range-over-built-in-types\">Range over Built-in Types</a></li>\n      \n        <li><a href=\"pointers\">Pointers</a></li>\n      \n        <li><a href=\"strings-and-runes\">Strings and Runes</a></li>\n      \n        <li><a href=\"structs\">Structs</a></li>\n      \n        <li><a href=\"methods\">Methods</a></li>\n      \n        <li><a href=\"interfaces\">Interfaces</a></li>\n      \n        <li><a href=\"enums\">Enums</a></li>\n      \n        <li><a href=\"struct-embedding\">Struct Embedding</a></li>\n      \n        <li><a href=\"generics\">Generics</a></li>\n      \n        <li><a href=\"range-over-iterators\">Range over Iterators</a></li>\n      \n        <li><a href=\"errors\">Errors</a></li>\n      \n        <li><a href=\"custom-errors\">Custom Errors</a></li>\n      \n        <li><a href=\"goroutines\">Goroutines</a></li>\n      \n        <li><a href=\"channels\">Channels</a></li>\n      \n        <li><a href=\"channel-buffering\">Channel Buffering</a></li>\n      \n        <li><a href=\"channel-synchronization\">Channel Synchronization</a></li>\n      \n        <li><a href=\"channel-directions\">Channel Directions</a></li>\n      \n        <li><a href=\"select\">Select</a></li>\n      \n        <li><a href=\"timeouts\">Timeouts</a></li>\n      \n        <li><a href=\"non-blocking-channel-operations\">Non-Blocking Channel Operations</a></li>\n      \n        <li><a href=\"closing-channels\">Closing Channels</a></li>\n      \n        <li><a href=\"range-over-channels\">Range over Channels</a></li>\n      \n        <li><a href=\"timers\">Timers</a></li>\n      \n        <li><a href=\"tickers\">Tickers</a></li>\n      \n        <li><a href=\"worker-pools\">Worker Pools</a></li>\n      \n        <li><a href=\"waitgroups\">WaitGroups</a></li>\n      \n        <li><a href=\"rate-limiting\">Rate Limiting</a></li>\n      \n        <li><a href=\"atomic-counters\">Atomic Counters</a></li>\n      \n        <li><a href=\"mutexes\">Mutexes</a></li>\n      \n        <li><a href=\"stateful-goroutines\">Stateful Goroutines</a></li>\n      \n        <li><a href=\"sorting\">Sorting</a></li>\n      \n        <li><a href=\"sorting-by-functions\">Sorting by Functions</a></li>\n      \n        <li><a href=\"panic\">Panic</a></li>\n      \n        <li><a href=\"defer\">Defer</a></li>\n      \n        <li><a href=\"recover\">Recover</a></li>\n      \n        <li><a href=\"string-functions\">String Functions</a></li>\n      \n        <li><a href=\"string-formatting\">String Formatting</a></li>\n      \n        <li><a href=\"text-templates\">Text Templates</a></li>\n      \n        <li><a href=\"regular-expressions\">Regular Expressions</a></li>\n      \n        <li><a href=\"json\">JSON</a></li>\n      \n        <li><a href=\"xml\">XML</a></li>\n      \n        <li><a href=\"time\">Time</a></li>\n      \n        <li><a href=\"epoch\">Epoch</a></li>\n      \n        <li><a href=\"time-formatting-parsing\">Time Formatting / Parsing</a></li>\n      \n        <li><a href=\"random-numbers\">Random Numbers</a></li>\n      \n        <li><a href=\"number-parsing\">Number Parsing</a></li>\n      \n        <li><a href=\"url-parsing\">URL Parsing</a></li>\n      \n        <li><a href=\"sha256-hashes\">SHA256 Hashes</a></li>\n      \n        <li><a href=\"base64-encoding\">Base64 Encoding</a></li>\n      \n        <li><a href=\"reading-files\">Reading Files</a></li>\n      \n        <li><a href=\"writing-files\">Writing Files</a></li>\n      \n        <li><a href=\"line-filters\">Line Filters</a></li>\n      \n        <li><a href=\"file-paths\">File Paths</a></li>\n      \n        <li><a href=\"directories\">Directories</a></li>\n      \n        <li><a href=\"temporary-files-and-directories\">Temporary Files and Directories</a></li>\n      \n        <li><a href=\"embed-directive\">Embed Directive</a></li>\n      \n        <li><a href=\"testing-and-benchmarking\">Testing and Benchmarking</a></li>\n      \n        <li><a href=\"command-line-arguments\">Command-Line Arguments</a></li>\n      \n        <li><a href=\"command-line-flags\">Command-Line Flags</a></li>\n      \n        <li><a href=\"command-line-subcommands\">Command-Line Subcommands</a></li>\n      \n        <li><a href=\"environment-variables\">Environment Variables</a></li>\n      \n        <li><a href=\"logging\">Logging</a></li>\n      \n        <li><a href=\"http-client\">HTTP Client</a></li>\n      \n        <li><a href=\"http-server\">HTTP Server</a></li>\n      \n        <li><a href=\"tcp-server\">TCP Server</a></li>\n      \n        <li><a href=\"context\">Context</a></li>\n      \n        <li><a href=\"spawning-processes\">Spawning Processes</a></li>\n      \n        <li><a href=\"execing-processes\">Exec'ing Processes</a></li>\n      \n        <li><a href=\"signals\">Signals</a></li>\n      \n        <li><a href=\"exit\">Exit</a></li>\n      \n      </ul>\n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "public/interfaces",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Interfaces</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'methods';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'enums';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"interfaces\">\n      <h2><a href=\"./\">Go by Example</a>: Interfaces</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Interfaces</em> are named collections of method\nsignatures.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/xAAbgd7GOKD\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;math&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a basic interface for geometric shapes.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">geometry</span> <span class=\"kd\">interface</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">area</span><span class=\"p\">()</span> <span class=\"kt\">float64</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">perim</span><span class=\"p\">()</span> <span class=\"kt\">float64</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For our example we&rsquo;ll implement this interface on\n<code>rect</code> and <code>circle</code> types.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">rect</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">height</span> <span class=\"kt\">float64</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">circle</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">radius</span> <span class=\"kt\">float64</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To implement an interface in Go, we just need to\nimplement all the methods in the interface. Here we\nimplement <code>geometry</code> on <code>rect</code>s.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">r</span> <span class=\"nx\">rect</span><span class=\"p\">)</span> <span class=\"nf\">area</span><span class=\"p\">()</span> <span class=\"kt\">float64</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"o\">*</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">height</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">r</span> <span class=\"nx\">rect</span><span class=\"p\">)</span> <span class=\"nf\">perim</span><span class=\"p\">()</span> <span class=\"kt\">float64</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"o\">+</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">height</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The implementation for <code>circle</code>s.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">c</span> <span class=\"nx\">circle</span><span class=\"p\">)</span> <span class=\"nf\">area</span><span class=\"p\">()</span> <span class=\"kt\">float64</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">math</span><span class=\"p\">.</span><span class=\"nx\">Pi</span> <span class=\"o\">*</span> <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">radius</span> <span class=\"o\">*</span> <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">radius</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">c</span> <span class=\"nx\">circle</span><span class=\"p\">)</span> <span class=\"nf\">perim</span><span class=\"p\">()</span> <span class=\"kt\">float64</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"nx\">math</span><span class=\"p\">.</span><span class=\"nx\">Pi</span> <span class=\"o\">*</span> <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">radius</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If a variable has an interface type, then we can call\nmethods that are in the named interface. Here&rsquo;s a\ngeneric <code>measure</code> function taking advantage of this\nto work on any <code>geometry</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">measure</span><span class=\"p\">(</span><span class=\"nx\">g</span> <span class=\"nx\">geometry</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">g</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">g</span><span class=\"p\">.</span><span class=\"nf\">area</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">g</span><span class=\"p\">.</span><span class=\"nf\">perim</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sometimes it&rsquo;s useful to know the runtime type of an\ninterface value. One option is using a <em>type assertion</em>\nas shown here; another is a <a href=\"switch\">type <code>switch</code></a>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">detectCircle</span><span class=\"p\">(</span><span class=\"nx\">g</span> <span class=\"nx\">geometry</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">c</span><span class=\"p\">,</span> <span class=\"nx\">ok</span> <span class=\"o\">:=</span> <span class=\"nx\">g</span><span class=\"p\">.(</span><span class=\"nx\">circle</span><span class=\"p\">);</span> <span class=\"nx\">ok</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;circle with radius&#34;</span><span class=\"p\">,</span> <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">radius</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r</span> <span class=\"o\">:=</span> <span class=\"nx\">rect</span><span class=\"p\">{</span><span class=\"nx\">width</span><span class=\"p\">:</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"p\">:</span> <span class=\"mi\">4</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span> <span class=\"o\">:=</span> <span class=\"nx\">circle</span><span class=\"p\">{</span><span class=\"nx\">radius</span><span class=\"p\">:</span> <span class=\"mi\">5</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>circle</code> and <code>rect</code> struct types both\nimplement the <code>geometry</code> interface so we can use\ninstances of\nthese structs as arguments to <code>measure</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">measure</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">measure</span><span class=\"p\">(</span><span class=\"nx\">c</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">detectCircle</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">detectCircle</span><span class=\"p\">(</span><span class=\"nx\">c</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run interfaces.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{3 4}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">12\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">14\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{5}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">78.53981633974483\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">31.41592653589793\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">circle with radius 5</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To understand how Go&rsquo;s interfaces work under the hood,\ncheck out this <a href=\"https://research.swtch.com/interfaces\">blog post</a>.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"enums\" rel=\"next\">Enums</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"math\\\"\\u000A)\\u000A');codeLines.push('type geometry interface {\\u000A    area() float64\\u000A    perim() float64\\u000A}\\u000A');codeLines.push('type rect struct {\\u000A    width, height float64\\u000A}\\u000Atype circle struct {\\u000A    radius float64\\u000A}\\u000A');codeLines.push('func (r rect) area() float64 {\\u000A    return r.width * r.height\\u000A}\\u000Afunc (r rect) perim() float64 {\\u000A    return 2*r.width + 2*r.height\\u000A}\\u000A');codeLines.push('func (c circle) area() float64 {\\u000A    return math.Pi * c.radius * c.radius\\u000A}\\u000Afunc (c circle) perim() float64 {\\u000A    return 2 * math.Pi * c.radius\\u000A}\\u000A');codeLines.push('func measure(g geometry) {\\u000A    fmt.Println(g)\\u000A    fmt.Println(g.area())\\u000A    fmt.Println(g.perim())\\u000A}\\u000A');codeLines.push('func detectCircle(g geometry) {\\u000A    if c, ok :\\u003D g.(circle); ok {\\u000A        fmt.Println(\\\"circle with radius\\\", c.radius)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A    r :\\u003D rect{width: 3, height: 4}\\u000A    c :\\u003D circle{radius: 5}\\u000A');codeLines.push('    measure(r)\\u000A    measure(c)\\u000A');codeLines.push('    detectCircle(r)\\u000A    detectCircle(c)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/json",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: JSON</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'regular-expressions';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'xml';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"json\">\n      <h2><a href=\"./\">Go by Example</a>: JSON</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers built-in support for JSON encoding and\ndecoding, including to and from built-in and custom\ndata types.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/zwf9dZ4pUPW\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;encoding/json&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll use these two structs to demonstrate encoding and\ndecoding of custom types below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">response1</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Page</span>   <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Fruits</span> <span class=\"p\">[]</span><span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Only exported fields will be encoded/decoded in JSON.\nFields must start with capital letters to be exported.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">response2</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Page</span>   <span class=\"kt\">int</span>      <span class=\"s\">`json:&#34;page&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Fruits</span> <span class=\"p\">[]</span><span class=\"kt\">string</span> <span class=\"s\">`json:&#34;fruits&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>First we&rsquo;ll look at encoding basic data types to\nJSON strings. Here are some examples for atomic\nvalues.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">bolB</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"kc\">true</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">bolB</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">intB</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">intB</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fltB</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"mf\">2.34</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">fltB</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">strB</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"s\">&#34;gopher&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">strB</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>And here are some for slices and maps, which encode\nto JSON arrays and objects as you&rsquo;d expect.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">slcD</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;apple&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;peach&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;pear&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">slcB</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"nx\">slcD</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">slcB</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mapD</span> <span class=\"o\">:=</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"s\">&#34;apple&#34;</span><span class=\"p\">:</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"s\">&#34;lettuce&#34;</span><span class=\"p\">:</span> <span class=\"mi\">7</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mapB</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"nx\">mapD</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">mapB</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The JSON package can automatically encode your\ncustom data types. It will only include exported\nfields in the encoded output and will by default\nuse those names as the JSON keys.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res1D</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">response1</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Page</span><span class=\"p\">:</span>   <span class=\"mi\">1</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Fruits</span><span class=\"p\">:</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;apple&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;peach&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;pear&#34;</span><span class=\"p\">}}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res1B</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"nx\">res1D</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">res1B</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can use tags on struct field declarations\nto customize the encoded JSON key names. Check the\ndefinition of <code>response2</code> above to see an example\nof such tags.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res2D</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">response2</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Page</span><span class=\"p\">:</span>   <span class=\"mi\">1</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Fruits</span><span class=\"p\">:</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;apple&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;peach&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;pear&#34;</span><span class=\"p\">}}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res2B</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Marshal</span><span class=\"p\">(</span><span class=\"nx\">res2D</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">res2B</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now let&rsquo;s look at decoding JSON data into Go\nvalues. Here&rsquo;s an example for a generic data\nstructure.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">byt</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"s\">`{&#34;num&#34;:6.13,&#34;strs&#34;:[&#34;a&#34;,&#34;b&#34;]}`</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We need to provide a variable where the JSON\npackage can put the decoded data. This\n<code>map[string]interface{}</code> will hold a map of strings\nto arbitrary data types.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">dat</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kd\">interface</span><span class=\"p\">{}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s the actual decoding, and a check for\nassociated errors.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Unmarshal</span><span class=\"p\">(</span><span class=\"nx\">byt</span><span class=\"p\">,</span> <span class=\"o\">&amp;</span><span class=\"nx\">dat</span><span class=\"p\">);</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">dat</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In order to use the values in the decoded map,\nwe&rsquo;ll need to convert them to their appropriate type.\nFor example here we convert the value in <code>num</code> to\nthe expected <code>float64</code> type.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">num</span> <span class=\"o\">:=</span> <span class=\"nx\">dat</span><span class=\"p\">[</span><span class=\"s\">&#34;num&#34;</span><span class=\"p\">].(</span><span class=\"kt\">float64</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">num</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Accessing nested data requires a series of\nconversions.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">strs</span> <span class=\"o\">:=</span> <span class=\"nx\">dat</span><span class=\"p\">[</span><span class=\"s\">&#34;strs&#34;</span><span class=\"p\">].([]</span><span class=\"kd\">interface</span><span class=\"p\">{})</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">str1</span> <span class=\"o\">:=</span> <span class=\"nx\">strs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">].(</span><span class=\"kt\">string</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">str1</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can also decode JSON into custom data types.\nThis has the advantages of adding additional\ntype-safety to our programs and eliminating the\nneed for type assertions when accessing the decoded\ndata.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">str</span> <span class=\"o\">:=</span> <span class=\"s\">`{&#34;page&#34;: 1, &#34;fruits&#34;: [&#34;apple&#34;, &#34;peach&#34;]}`</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res</span> <span class=\"o\">:=</span> <span class=\"nx\">response2</span><span class=\"p\">{}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">Unmarshal</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"nx\">str</span><span class=\"p\">),</span> <span class=\"o\">&amp;</span><span class=\"nx\">res</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">res</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">res</span><span class=\"p\">.</span><span class=\"nx\">Fruits</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In the examples above we always used bytes and\nstrings as intermediates between the data and\nJSON representation on standard out. We can also\nstream JSON encodings directly to <code>os.Writer</code>s like\n<code>os.Stdout</code> or even HTTP response bodies.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">enc</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">NewEncoder</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">d</span> <span class=\"o\">:=</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"s\">&#34;apple&#34;</span><span class=\"p\">:</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"s\">&#34;lettuce&#34;</span><span class=\"p\">:</span> <span class=\"mi\">7</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">enc</span><span class=\"p\">.</span><span class=\"nf\">Encode</span><span class=\"p\">(</span><span class=\"nx\">d</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Streaming reads from <code>os.Reader</code>s like <code>os.Stdin</code>\nor HTTP request bodies is done with <code>json.Decoder</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dec</span> <span class=\"o\">:=</span> <span class=\"nx\">json</span><span class=\"p\">.</span><span class=\"nf\">NewDecoder</span><span class=\"p\">(</span><span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">NewReader</span><span class=\"p\">(</span><span class=\"nx\">str</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">res1</span> <span class=\"o\">:=</span> <span class=\"nx\">response2</span><span class=\"p\">{}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dec</span><span class=\"p\">.</span><span class=\"nf\">Decode</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">res1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">res1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run json.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2.34\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">&#34;gopher&#34;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[&#34;apple&#34;,&#34;peach&#34;,&#34;pear&#34;]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{&#34;apple&#34;:5,&#34;lettuce&#34;:7}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{&#34;Page&#34;:1,&#34;Fruits&#34;:[&#34;apple&#34;,&#34;peach&#34;,&#34;pear&#34;]}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{&#34;page&#34;:1,&#34;fruits&#34;:[&#34;apple&#34;,&#34;peach&#34;,&#34;pear&#34;]}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map[num:6.13 strs:[a b]]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">6.13\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">a\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{1 [apple peach]}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">apple\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{&#34;apple&#34;:5,&#34;lettuce&#34;:7}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{1 [apple peach]}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ve covered the basic of JSON in Go here, but check\nout the <a href=\"https://go.dev/blog/json\">JSON and Go</a>\nblog post and <a href=\"https://pkg.go.dev/encoding/json\">JSON package docs</a>\nfor more.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"xml\" rel=\"next\">XML</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"encoding/json\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A    \\\"strings\\\"\\u000A)\\u000A');codeLines.push('type response1 struct {\\u000A    Page   int\\u000A    Fruits []string\\u000A}\\u000A');codeLines.push('type response2 struct {\\u000A    Page   int      `json:\\\"page\\\"`\\u000A    Fruits []string `json:\\\"fruits\\\"`\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    bolB, _ :\\u003D json.Marshal(true)\\u000A    fmt.Println(string(bolB))\\u000A');codeLines.push('    intB, _ :\\u003D json.Marshal(1)\\u000A    fmt.Println(string(intB))\\u000A');codeLines.push('    fltB, _ :\\u003D json.Marshal(2.34)\\u000A    fmt.Println(string(fltB))\\u000A');codeLines.push('    strB, _ :\\u003D json.Marshal(\\\"gopher\\\")\\u000A    fmt.Println(string(strB))\\u000A');codeLines.push('    slcD :\\u003D []string{\\\"apple\\\", \\\"peach\\\", \\\"pear\\\"}\\u000A    slcB, _ :\\u003D json.Marshal(slcD)\\u000A    fmt.Println(string(slcB))\\u000A');codeLines.push('    mapD :\\u003D map[string]int{\\\"apple\\\": 5, \\\"lettuce\\\": 7}\\u000A    mapB, _ :\\u003D json.Marshal(mapD)\\u000A    fmt.Println(string(mapB))\\u000A');codeLines.push('    res1D :\\u003D \\u0026response1{\\u000A        Page:   1,\\u000A        Fruits: []string{\\\"apple\\\", \\\"peach\\\", \\\"pear\\\"}}\\u000A    res1B, _ :\\u003D json.Marshal(res1D)\\u000A    fmt.Println(string(res1B))\\u000A');codeLines.push('    res2D :\\u003D \\u0026response2{\\u000A        Page:   1,\\u000A        Fruits: []string{\\\"apple\\\", \\\"peach\\\", \\\"pear\\\"}}\\u000A    res2B, _ :\\u003D json.Marshal(res2D)\\u000A    fmt.Println(string(res2B))\\u000A');codeLines.push('    byt :\\u003D []byte(`{\\\"num\\\":6.13,\\\"strs\\\":[\\\"a\\\",\\\"b\\\"]}`)\\u000A');codeLines.push('    var dat map[string]interface{}\\u000A');codeLines.push('    if err :\\u003D json.Unmarshal(byt, \\u0026dat); err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    fmt.Println(dat)\\u000A');codeLines.push('    num :\\u003D dat[\\\"num\\\"].(float64)\\u000A    fmt.Println(num)\\u000A');codeLines.push('    strs :\\u003D dat[\\\"strs\\\"].([]interface{})\\u000A    str1 :\\u003D strs[0].(string)\\u000A    fmt.Println(str1)\\u000A');codeLines.push('    str :\\u003D `{\\\"page\\\": 1, \\\"fruits\\\": [\\\"apple\\\", \\\"peach\\\"]}`\\u000A    res :\\u003D response2{}\\u000A    json.Unmarshal([]byte(str), \\u0026res)\\u000A    fmt.Println(res)\\u000A    fmt.Println(res.Fruits[0])\\u000A');codeLines.push('    enc :\\u003D json.NewEncoder(os.Stdout)\\u000A    d :\\u003D map[string]int{\\\"apple\\\": 5, \\\"lettuce\\\": 7}\\u000A    enc.Encode(d)\\u000A');codeLines.push('    dec :\\u003D json.NewDecoder(strings.NewReader(str))\\u000A    res1 :\\u003D response2{}\\u000A    dec.Decode(\\u0026res1)\\u000A    fmt.Println(res1)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/line-filters",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Line Filters</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'writing-files';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'file-paths';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"line-filters\">\n      <h2><a href=\"./\">Go by Example</a>: Line Filters</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <em>line filter</em> is a common type of program that reads\ninput on stdin, processes it, and then prints some\nderived result to stdout. <code>grep</code> and <code>sed</code> are common\nline filters.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s an example line filter in Go that writes a\ncapitalized version of all input text. You can use this\npattern to write your own Go line filters.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/kNcupWRsYPP\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bufio&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Wrapping the unbuffered <code>os.Stdin</code> with a buffered\nscanner gives us a convenient <code>Scan</code> method that\nadvances the scanner to the next token; which is\nthe next line in the default scanner.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">scanner</span> <span class=\"o\">:=</span> <span class=\"nx\">bufio</span><span class=\"p\">.</span><span class=\"nf\">NewScanner</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdin</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Text</code> returns the current token, here the next line,\nfrom the input.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">scanner</span><span class=\"p\">.</span><span class=\"nf\">Scan</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">ucl</span> <span class=\"o\">:=</span> <span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">ToUpper</span><span class=\"p\">(</span><span class=\"nx\">scanner</span><span class=\"p\">.</span><span class=\"nf\">Text</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Write out the uppercased line.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">ucl</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Check for errors during <code>Scan</code>. End of file is\nexpected and not reported by <code>Scan</code> as an error.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">scanner</span><span class=\"p\">.</span><span class=\"nf\">Err</span><span class=\"p\">();</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Fprintln</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stderr</span><span class=\"p\">,</span> <span class=\"s\">&#34;error:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Exit</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To try out our line filter, first make a file with a few\nlowercase lines.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#39;hello&#39;   &gt; /tmp/lines\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#39;filter&#39; &gt;&gt; /tmp/lines</span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Then use the line filter to get uppercase lines.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> cat /tmp/lines | go run line-filters.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">HELLO\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">FILTER</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"file-paths\" rel=\"next\">File Paths</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bufio\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A    \\\"strings\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    scanner :\\u003D bufio.NewScanner(os.Stdin)\\u000A');codeLines.push('    for scanner.Scan() {\\u000A');codeLines.push('        ucl :\\u003D strings.ToUpper(scanner.Text())\\u000A');codeLines.push('        fmt.Println(ucl)\\u000A    }\\u000A');codeLines.push('    if err :\\u003D scanner.Err(); err !\\u003D nil {\\u000A        fmt.Fprintln(os.Stderr, \\\"error:\\\", err)\\u000A        os.Exit(1)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/logging",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Logging</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'environment-variables';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'http-client';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"logging\">\n      <h2><a href=\"./\">Go by Example</a>: Logging</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The Go standard library provides straightforward\ntools for outputting logs from Go programs, with\nthe <a href=\"https://pkg.go.dev/log\">log</a> package for\nfree-form output and the\n<a href=\"https://pkg.go.dev/log/slog\">log/slog</a> package for\nstructured output.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/Qd0uCqBlYUn\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bytes&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;log&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;log/slog&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Simply invoking functions like <code>Println</code> from the\n<code>log</code> package uses the <em>standard</em> logger, which\nis already pre-configured for reasonable logging\noutput to <code>os.Stderr</code>. Additional methods like\n<code>Fatal*</code> or <code>Panic*</code> will exit the program after\nlogging.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;standard logger&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Loggers can be configured with <em>flags</em> to set\ntheir output format. By default, the standard\nlogger has the <code>log.Ldate</code> and <code>log.Ltime</code> flags\nset, and these are collected in <code>log.LstdFlags</code>.\nWe can change its flags to emit time with\nmicrosecond accuracy, for example.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">SetFlags</span><span class=\"p\">(</span><span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nx\">LstdFlags</span> <span class=\"p\">|</span> <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nx\">Lmicroseconds</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;with micro&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It also supports emitting the file name and\nline from which the <code>log</code> function is called.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">SetFlags</span><span class=\"p\">(</span><span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nx\">LstdFlags</span> <span class=\"p\">|</span> <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nx\">Lshortfile</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;with file/line&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It may be useful to create a custom logger and\npass it around. When creating a new logger, we\ncan set a <em>prefix</em> to distinguish its output\nfrom other loggers.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mylog</span> <span class=\"o\">:=</span> <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"s\">&#34;my:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nx\">LstdFlags</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mylog</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;from mylog&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can set the prefix\non existing loggers (including the standard one)\nwith the <code>SetPrefix</code> method.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mylog</span><span class=\"p\">.</span><span class=\"nf\">SetPrefix</span><span class=\"p\">(</span><span class=\"s\">&#34;ohmy:&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mylog</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;from mylog&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Loggers can have custom output targets;\nany <code>io.Writer</code> works.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">buf</span> <span class=\"nx\">bytes</span><span class=\"p\">.</span><span class=\"nx\">Buffer</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">buflog</span> <span class=\"o\">:=</span> <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">buf</span><span class=\"p\">,</span> <span class=\"s\">&#34;buf:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nx\">LstdFlags</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This call writes the log output into <code>buf</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">buflog</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;hello&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This will actually show it on standard output.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"s\">&#34;from buflog:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">buf</span><span class=\"p\">.</span><span class=\"nf\">String</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>slog</code> package provides\n<em>structured</em> log output. For example, logging\nin JSON format is straightforward.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">jsonHandler</span> <span class=\"o\">:=</span> <span class=\"nx\">slog</span><span class=\"p\">.</span><span class=\"nf\">NewJSONHandler</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stderr</span><span class=\"p\">,</span> <span class=\"kc\">nil</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">myslog</span> <span class=\"o\">:=</span> <span class=\"nx\">slog</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"nx\">jsonHandler</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">myslog</span><span class=\"p\">.</span><span class=\"nf\">Info</span><span class=\"p\">(</span><span class=\"s\">&#34;hi there&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In addition to the message, <code>slog</code> output can\ncontain an arbitrary number of key=value\npairs.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">myslog</span><span class=\"p\">.</span><span class=\"nf\">Info</span><span class=\"p\">(</span><span class=\"s\">&#34;hello again&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;key&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;val&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;age&#34;</span><span class=\"p\">,</span> <span class=\"mi\">25</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sample output; the date and time\nemitted will depend on when the example ran.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run logging.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2023/08/22 10:45:16 standard logger\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2023/08/22 10:45:16.904141 with micro\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2023/08/22 10:45:16 logging.go:40: with file/line\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">my:2023/08/22 10:45:16 from mylog\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ohmy:2023/08/22 10:45:16 from mylog\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">from buflog:buf:2023/08/22 10:45:16 hello</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>These are wrapped for clarity of presentation\non the website; in reality they are emitted\non a single line.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">{&#34;time&#34;:&#34;2023-08-22T10:45:16.904166391-07:00&#34;,\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &#34;level&#34;:&#34;INFO&#34;,&#34;msg&#34;:&#34;hi there&#34;}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{&#34;time&#34;:&#34;2023-08-22T10:45:16.904178985-07:00&#34;,\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    &#34;level&#34;:&#34;INFO&#34;,&#34;msg&#34;:&#34;hello again&#34;,\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    &#34;key&#34;:&#34;val&#34;,&#34;age&#34;:25}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"http-client\" rel=\"next\">HTTP Client</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bytes\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"log\\\"\\u000A    \\\"os\\\"\\u000A');codeLines.push('    \\\"log/slog\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    log.Println(\\\"standard logger\\\")\\u000A');codeLines.push('    log.SetFlags(log.LstdFlags | log.Lmicroseconds)\\u000A    log.Println(\\\"with micro\\\")\\u000A');codeLines.push('    log.SetFlags(log.LstdFlags | log.Lshortfile)\\u000A    log.Println(\\\"with file/line\\\")\\u000A');codeLines.push('    mylog :\\u003D log.New(os.Stdout, \\\"my:\\\", log.LstdFlags)\\u000A    mylog.Println(\\\"from mylog\\\")\\u000A');codeLines.push('    mylog.SetPrefix(\\\"ohmy:\\\")\\u000A    mylog.Println(\\\"from mylog\\\")\\u000A');codeLines.push('    var buf bytes.Buffer\\u000A    buflog :\\u003D log.New(\\u0026buf, \\\"buf:\\\", log.LstdFlags)\\u000A');codeLines.push('    buflog.Println(\\\"hello\\\")\\u000A');codeLines.push('    fmt.Print(\\\"from buflog:\\\", buf.String())\\u000A');codeLines.push('    jsonHandler :\\u003D slog.NewJSONHandler(os.Stderr, nil)\\u000A    myslog :\\u003D slog.New(jsonHandler)\\u000A    myslog.Info(\\\"hi there\\\")\\u000A');codeLines.push('    myslog.Info(\\\"hello again\\\", \\\"key\\\", \\\"val\\\", \\\"age\\\", 25)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/maps",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Maps</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'slices';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'functions';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"maps\">\n      <h2><a href=\"./\">Go by Example</a>: Maps</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Maps</em> are Go&rsquo;s built-in <a href=\"https://en.wikipedia.org/wiki/Associative_array\">associative data type</a>\n(sometimes called <em>hashes</em> or <em>dicts</em> in other languages).</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/5jpkxJ2T0Lv\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;maps&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To create an empty map, use the builtin <code>make</code>:\n<code>make(map[key-type]val-type)</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">m</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Set key/value pairs using typical <code>name[key] = val</code>\nsyntax.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">m</span><span class=\"p\">[</span><span class=\"s\">&#34;k1&#34;</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"mi\">7</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">m</span><span class=\"p\">[</span><span class=\"s\">&#34;k2&#34;</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"mi\">13</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Printing a map with e.g. <code>fmt.Println</code> will show all of\nits key/value pairs.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;map:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">m</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Get a value for a key with <code>name[key]</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">v1</span> <span class=\"o\">:=</span> <span class=\"nx\">m</span><span class=\"p\">[</span><span class=\"s\">&#34;k1&#34;</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;v1:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">v1</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If the key doesn&rsquo;t exist, the\n<a href=\"https://go.dev/ref/spec#The_zero_value\">zero value</a> of the\nvalue type is returned.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">v3</span> <span class=\"o\">:=</span> <span class=\"nx\">m</span><span class=\"p\">[</span><span class=\"s\">&#34;k3&#34;</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;v3:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">v3</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The builtin <code>len</code> returns the number of key/value\npairs when called on a map.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;len:&#34;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">m</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The builtin <code>delete</code> removes key/value pairs from\na map.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">delete</span><span class=\"p\">(</span><span class=\"nx\">m</span><span class=\"p\">,</span> <span class=\"s\">&#34;k2&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;map:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">m</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To remove <em>all</em> key/value pairs from a map, use\nthe <code>clear</code> builtin.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">clear</span><span class=\"p\">(</span><span class=\"nx\">m</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;map:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">m</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The optional second return value when getting a\nvalue from a map indicates if the key was present\nin the map. This can be used to disambiguate\nbetween missing keys and keys with zero values\nlike <code>0</code> or <code>&quot;&quot;</code>. Here we didn&rsquo;t need the value\nitself, so we ignored it with the <em>blank identifier</em>\n<code>_</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">prs</span> <span class=\"o\">:=</span> <span class=\"nx\">m</span><span class=\"p\">[</span><span class=\"s\">&#34;k2&#34;</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;prs:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">prs</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also declare and initialize a new map in\nthe same line with this syntax.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n</span> <span class=\"o\">:=</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"s\">&#34;foo&#34;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s\">&#34;bar&#34;</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;map:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">n</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>maps</code> package contains a number of useful\nutility functions for maps.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n2</span> <span class=\"o\">:=</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"s\">&#34;foo&#34;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s\">&#34;bar&#34;</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">maps</span><span class=\"p\">.</span><span class=\"nf\">Equal</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"p\">,</span> <span class=\"nx\">n2</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;n == n2&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that maps appear in the form <code>map[k:v k:v]</code> when\nprinted with <code>fmt.Println</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run maps.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map: map[k1:7 k2:13]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">v1: 7\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">v3: 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">len: 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map: map[k1:7]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map: map[]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">prs: false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map: map[bar:2 foo:1]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">n == n2</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"functions\" rel=\"next\">Functions</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"maps\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    m :\\u003D make(map[string]int)\\u000A');codeLines.push('    m[\\\"k1\\\"] \\u003D 7\\u000A    m[\\\"k2\\\"] \\u003D 13\\u000A');codeLines.push('    fmt.Println(\\\"map:\\\", m)\\u000A');codeLines.push('    v1 :\\u003D m[\\\"k1\\\"]\\u000A    fmt.Println(\\\"v1:\\\", v1)\\u000A');codeLines.push('    v3 :\\u003D m[\\\"k3\\\"]\\u000A    fmt.Println(\\\"v3:\\\", v3)\\u000A');codeLines.push('    fmt.Println(\\\"len:\\\", len(m))\\u000A');codeLines.push('    delete(m, \\\"k2\\\")\\u000A    fmt.Println(\\\"map:\\\", m)\\u000A');codeLines.push('    clear(m)\\u000A    fmt.Println(\\\"map:\\\", m)\\u000A');codeLines.push('    _, prs :\\u003D m[\\\"k2\\\"]\\u000A    fmt.Println(\\\"prs:\\\", prs)\\u000A');codeLines.push('    n :\\u003D map[string]int{\\\"foo\\\": 1, \\\"bar\\\": 2}\\u000A    fmt.Println(\\\"map:\\\", n)\\u000A');codeLines.push('    n2 :\\u003D map[string]int{\\\"foo\\\": 1, \\\"bar\\\": 2}\\u000A    if maps.Equal(n, n2) {\\u000A        fmt.Println(\\\"n \\u003D\\u003D n2\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/methods",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Methods</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'structs';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'interfaces';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"methods\">\n      <h2><a href=\"./\">Go by Example</a>: Methods</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports <em>methods</em> defined on struct types.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/4wmDCAydC1e\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">rect</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">width</span><span class=\"p\">,</span> <span class=\"nx\">height</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This <code>area</code> method has a <em>receiver type</em> of <code>*rect</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">r</span> <span class=\"o\">*</span><span class=\"nx\">rect</span><span class=\"p\">)</span> <span class=\"nf\">area</span><span class=\"p\">()</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"o\">*</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">height</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Methods can be defined for either pointer or value\nreceiver types. Here&rsquo;s an example of a value receiver.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">r</span> <span class=\"nx\">rect</span><span class=\"p\">)</span> <span class=\"nf\">perim</span><span class=\"p\">()</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">width</span> <span class=\"o\">+</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nx\">height</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r</span> <span class=\"o\">:=</span> <span class=\"nx\">rect</span><span class=\"p\">{</span><span class=\"nx\">width</span><span class=\"p\">:</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"nx\">height</span><span class=\"p\">:</span> <span class=\"mi\">5</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we call the 2 methods defined for our struct.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;area: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">area</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;perim:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">perim</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go automatically handles conversion between values\nand pointers for method calls. You may want to use\na pointer receiver type to avoid copying on method\ncalls or to allow the method to mutate the\nreceiving struct.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">rp</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">r</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;area: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">rp</span><span class=\"p\">.</span><span class=\"nf\">area</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;perim:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">rp</span><span class=\"p\">.</span><span class=\"nf\">perim</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run methods.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">area:  50\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">perim: 30\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">area:  50\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">perim: 30</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at Go&rsquo;s mechanism for grouping and\nnaming related sets of methods: interfaces.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"interfaces\" rel=\"next\">Interfaces</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('type rect struct {\\u000A    width, height int\\u000A}\\u000A');codeLines.push('func (r *rect) area() int {\\u000A    return r.width * r.height\\u000A}\\u000A');codeLines.push('func (r rect) perim() int {\\u000A    return 2*r.width + 2*r.height\\u000A}\\u000A');codeLines.push('func main() {\\u000A    r :\\u003D rect{width: 10, height: 5}\\u000A');codeLines.push('    fmt.Println(\\\"area: \\\", r.area())\\u000A    fmt.Println(\\\"perim:\\\", r.perim())\\u000A');codeLines.push('    rp :\\u003D \\u0026r\\u000A    fmt.Println(\\\"area: \\\", rp.area())\\u000A    fmt.Println(\\\"perim:\\\", rp.perim())\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/multiple-return-values",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Multiple Return Values</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'functions';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'variadic-functions';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"multiple-return-values\">\n      <h2><a href=\"./\">Go by Example</a>: Multiple Return Values</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go has built-in support for <em>multiple return values</em>.\nThis feature is used often in idiomatic Go, for example\nto return both result and error values from a function.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/vZdUvLB1WbK\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>(int, int)</code> in this function signature shows that\nthe function returns 2 <code>int</code>s.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">vals</span><span class=\"p\">()</span> <span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">7</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we use the 2 different return values from the\ncall with <em>multiple assignment</em>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"o\">:=</span> <span class=\"nf\">vals</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">b</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you only want a subset of the returned values,\nuse the blank identifier <code>_</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">c</span> <span class=\"o\">:=</span> <span class=\"nf\">vals</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">c</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run multiple-return-values.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">7\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">7</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Accepting a variable number of arguments is another nice\nfeature of Go functions; we&rsquo;ll look at this next.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"variadic-functions\" rel=\"next\">Variadic Functions</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func vals() (int, int) {\\u000A    return 3, 7\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    a, b :\\u003D vals()\\u000A    fmt.Println(a)\\u000A    fmt.Println(b)\\u000A');codeLines.push('    _, c :\\u003D vals()\\u000A    fmt.Println(c)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/mutexes",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Mutexes</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'atomic-counters';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'stateful-goroutines';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"mutexes\">\n      <h2><a href=\"./\">Go by Example</a>: Mutexes</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In the previous example we saw how to manage simple\ncounter state using <a href=\"atomic-counters\">atomic operations</a>.\nFor more complex state we can use a <a href=\"https://en.wikipedia.org/wiki/Mutual_exclusion\"><em>mutex</em></a>\nto safely access data across multiple goroutines.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/u0VAVSWRlU0\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;sync&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Container holds a map of counters; since we want to\nupdate it concurrently from multiple goroutines, we\nadd a <code>Mutex</code> to synchronize access.\nNote that mutexes must not be copied, so if this\n<code>struct</code> is passed around, it should be done by\npointer.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">Container</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">mu</span>       <span class=\"nx\">sync</span><span class=\"p\">.</span><span class=\"nx\">Mutex</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">counters</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Lock the mutex before accessing <code>counters</code>; unlock\nit at the end of the function using a <a href=\"defer\">defer</a>\nstatement.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">c</span> <span class=\"o\">*</span><span class=\"nx\">Container</span><span class=\"p\">)</span> <span class=\"nf\">inc</span><span class=\"p\">(</span><span class=\"nx\">name</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">mu</span><span class=\"p\">.</span><span class=\"nf\">Lock</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">mu</span><span class=\"p\">.</span><span class=\"nf\">Unlock</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">counters</span><span class=\"p\">[</span><span class=\"nx\">name</span><span class=\"p\">]</span><span class=\"o\">++</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that the zero value of a mutex is usable as-is, so no\ninitialization is required here.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span> <span class=\"o\">:=</span> <span class=\"nx\">Container</span><span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">counters</span><span class=\"p\">:</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"s\">&#34;a&#34;</span><span class=\"p\">:</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s\">&#34;b&#34;</span><span class=\"p\">:</span> <span class=\"mi\">0</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">wg</span> <span class=\"nx\">sync</span><span class=\"p\">.</span><span class=\"nx\">WaitGroup</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This function increments a named counter\nin a loop.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">doIncrement</span> <span class=\"o\">:=</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">name</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"nx\">n</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"nx\">n</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nf\">inc</span><span class=\"p\">(</span><span class=\"nx\">name</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Run several goroutines concurrently; note\nthat they all access the same <code>Container</code>,\nand two of them access the same counter.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Go</span><span class=\"p\">(</span><span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">doIncrement</span><span class=\"p\">(</span><span class=\"s\">&#34;a&#34;</span><span class=\"p\">,</span> <span class=\"mi\">10000</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Go</span><span class=\"p\">(</span><span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">doIncrement</span><span class=\"p\">(</span><span class=\"s\">&#34;a&#34;</span><span class=\"p\">,</span> <span class=\"mi\">10000</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Go</span><span class=\"p\">(</span><span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">doIncrement</span><span class=\"p\">(</span><span class=\"s\">&#34;b&#34;</span><span class=\"p\">,</span> <span class=\"mi\">10000</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Wait for the goroutines to finish</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Wait</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">c</span><span class=\"p\">.</span><span class=\"nx\">counters</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running the program shows that the counters\nupdated as expected.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run mutexes.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map[a:20000 b:10000]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at implementing this same state\nmanagement task using only goroutines and channels.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"stateful-goroutines\" rel=\"next\">Stateful Goroutines</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"sync\\\"\\u000A)\\u000A');codeLines.push('type Container struct {\\u000A    mu       sync.Mutex\\u000A    counters map[string]int\\u000A}\\u000A');codeLines.push('func (c *Container) inc(name string) {\\u000A');codeLines.push('    c.mu.Lock()\\u000A    defer c.mu.Unlock()\\u000A    c.counters[name]++\\u000A}\\u000A');codeLines.push('func main() {\\u000A    c :\\u003D Container{\\u000A');codeLines.push('        counters: map[string]int{\\\"a\\\": 0, \\\"b\\\": 0},\\u000A    }\\u000A');codeLines.push('    var wg sync.WaitGroup\\u000A');codeLines.push('    doIncrement :\\u003D func(name string, n int) {\\u000A        for range n {\\u000A            c.inc(name)\\u000A        }\\u000A    }\\u000A');codeLines.push('    wg.Go(func() {\\u000A        doIncrement(\\\"a\\\", 10000)\\u000A    })\\u000A');codeLines.push('    wg.Go(func() {\\u000A        doIncrement(\\\"a\\\", 10000)\\u000A    })\\u000A');codeLines.push('    wg.Go(func() {\\u000A        doIncrement(\\\"b\\\", 10000)\\u000A    })\\u000A');codeLines.push('    wg.Wait()\\u000A    fmt.Println(c.counters)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/non-blocking-channel-operations",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Non-Blocking Channel Operations</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'timeouts';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'closing-channels';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"non-blocking-channel-operations\">\n      <h2><a href=\"./\">Go by Example</a>: Non-Blocking Channel Operations</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Basic sends and receives on channels are blocking.\nHowever, we can use <code>select</code> with a <code>default</code> clause to\nimplement <em>non-blocking</em> sends, receives, and even\nnon-blocking multi-way <code>select</code>s.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/TFv6-7OVNVq\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">messages</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">signals</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">bool</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a non-blocking receive. If a value is\navailable on <code>messages</code> then <code>select</code> will take\nthe <code>&lt;-messages</code> <code>case</code> with that value. If not\nit will immediately take the <code>default</code> case.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">msg</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">messages</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received message&#34;</span><span class=\"p\">,</span> <span class=\"nx\">msg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;no message received&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A non-blocking send works similarly. Here <code>msg</code>\ncannot be sent to the <code>messages</code> channel, because\nthe channel has no buffer and there is no receiver.\nTherefore the <code>default</code> case is selected.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">msg</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;hi&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">messages</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">msg</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sent message&#34;</span><span class=\"p\">,</span> <span class=\"nx\">msg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;no message sent&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can use multiple <code>case</code>s above the <code>default</code>\nclause to implement a multi-way non-blocking\nselect. Here we attempt non-blocking receives\non both <code>messages</code> and <code>signals</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">msg</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">messages</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received message&#34;</span><span class=\"p\">,</span> <span class=\"nx\">msg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">sig</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">signals</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received signal&#34;</span><span class=\"p\">,</span> <span class=\"nx\">sig</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;no activity&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run non-blocking-channel-operations.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">no message received\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">no message sent\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">no activity</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"closing-channels\" rel=\"next\">Closing Channels</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A    messages :\\u003D make(chan string)\\u000A    signals :\\u003D make(chan bool)\\u000A');codeLines.push('    select {\\u000A    case msg :\\u003D \\u003C-messages:\\u000A        fmt.Println(\\\"received message\\\", msg)\\u000A    default:\\u000A        fmt.Println(\\\"no message received\\\")\\u000A    }\\u000A');codeLines.push('    msg :\\u003D \\\"hi\\\"\\u000A    select {\\u000A    case messages \\u003C- msg:\\u000A        fmt.Println(\\\"sent message\\\", msg)\\u000A    default:\\u000A        fmt.Println(\\\"no message sent\\\")\\u000A    }\\u000A');codeLines.push('    select {\\u000A    case msg :\\u003D \\u003C-messages:\\u000A        fmt.Println(\\\"received message\\\", msg)\\u000A    case sig :\\u003D \\u003C-signals:\\u000A        fmt.Println(\\\"received signal\\\", sig)\\u000A    default:\\u000A        fmt.Println(\\\"no activity\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/number-parsing",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Number Parsing</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'random-numbers';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'url-parsing';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"number-parsing\">\n      <h2><a href=\"./\">Go by Example</a>: Number Parsing</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Parsing numbers from strings is a basic but common task\nin many programs; here&rsquo;s how to do it in Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/ZAMEid6Fpmu\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The built-in package <code>strconv</code> provides the number\nparsing.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strconv&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>With <code>ParseFloat</code>, this <code>64</code> tells how many bits of\nprecision to parse.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">strconv</span><span class=\"p\">.</span><span class=\"nf\">ParseFloat</span><span class=\"p\">(</span><span class=\"s\">&#34;1.234&#34;</span><span class=\"p\">,</span> <span class=\"mi\">64</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For <code>ParseInt</code>, the <code>0</code> means infer the base from\nthe string. <code>64</code> requires that the result fit in 64\nbits.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">i</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">strconv</span><span class=\"p\">.</span><span class=\"nf\">ParseInt</span><span class=\"p\">(</span><span class=\"s\">&#34;123&#34;</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">64</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>ParseInt</code> will recognize hex-formatted numbers.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">d</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">strconv</span><span class=\"p\">.</span><span class=\"nf\">ParseInt</span><span class=\"p\">(</span><span class=\"s\">&#34;0x1c8&#34;</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">64</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">d</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>ParseUint</code> is also available.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">u</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">strconv</span><span class=\"p\">.</span><span class=\"nf\">ParseUint</span><span class=\"p\">(</span><span class=\"s\">&#34;789&#34;</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">64</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Atoi</code> is a convenience function for basic base-10\n<code>int</code> parsing.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">k</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">strconv</span><span class=\"p\">.</span><span class=\"nf\">Atoi</span><span class=\"p\">(</span><span class=\"s\">&#34;135&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">k</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Parse functions return an error on bad input.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">e</span> <span class=\"o\">:=</span> <span class=\"nx\">strconv</span><span class=\"p\">.</span><span class=\"nf\">Atoi</span><span class=\"p\">(</span><span class=\"s\">&#34;wat&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run number-parsing.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1.234\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">123\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">456\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">789\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">135\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">strconv.ParseInt: parsing &#34;wat&#34;: invalid syntax</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at another common parsing task: URLs.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"url-parsing\" rel=\"next\">URL Parsing</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"strconv\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    f, _ :\\u003D strconv.ParseFloat(\\\"1.234\\\", 64)\\u000A    fmt.Println(f)\\u000A');codeLines.push('    i, _ :\\u003D strconv.ParseInt(\\\"123\\\", 0, 64)\\u000A    fmt.Println(i)\\u000A');codeLines.push('    d, _ :\\u003D strconv.ParseInt(\\\"0x1c8\\\", 0, 64)\\u000A    fmt.Println(d)\\u000A');codeLines.push('    u, _ :\\u003D strconv.ParseUint(\\\"789\\\", 0, 64)\\u000A    fmt.Println(u)\\u000A');codeLines.push('    k, _ :\\u003D strconv.Atoi(\\\"135\\\")\\u000A    fmt.Println(k)\\u000A');codeLines.push('    _, e :\\u003D strconv.Atoi(\\\"wat\\\")\\u000A    fmt.Println(e)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/panic",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Panic</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'sorting-by-functions';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'defer';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"panic\">\n      <h2><a href=\"./\">Go by Example</a>: Panic</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>panic</code> typically means something went unexpectedly\nwrong. Mostly we use it to fail fast on errors that\nshouldn&rsquo;t occur during normal operation, or that we\naren&rsquo;t prepared to handle gracefully.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/Z57OSC0ASwn\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll use panic throughout this site to check for\nunexpected errors. This is the only program on the\nsite designed to panic.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"s\">&#34;a problem&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A common use of panic is to abort if a function\nreturns an error value that we don&rsquo;t know how to\n(or want to) handle. Here&rsquo;s an example of\n<code>panic</code>king if we get an unexpected error when creating a new file.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">path</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">TempDir</span><span class=\"p\">(),</span> <span class=\"s\">&#34;file&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Create</span><span class=\"p\">(</span><span class=\"nx\">path</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running this program will cause it to panic, print\nan error message and goroutine traces, and exit with\na non-zero status.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When first panic in <code>main</code> fires, the program exits\nwithout reaching the rest of the code. If you&rsquo;d like\nto see the program try to create a temp file, comment\nthe first panic out.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run panic.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">panic: a problem</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">goroutine 1 [running]:\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">main.main()\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    /.../panic.go:12 +0x47\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">...\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">exit status 2</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that unlike some languages which use exceptions\nfor handling of many errors, in Go it is idiomatic\nto use error-indicating return values wherever possible.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"defer\" rel=\"next\">Defer</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"os\\\"\\u000A    \\\"path/filepath\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    panic(\\\"a problem\\\")\\u000A');codeLines.push('    path :\\u003D filepath.Join(os.TempDir(), \\\"file\\\")\\u000A    _, err :\\u003D os.Create(path)\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/pointers",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Pointers</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'range-over-built-in-types';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'strings-and-runes';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"pointers\">\n      <h2><a href=\"./\">Go by Example</a>: Pointers</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports <em><a href=\"https://en.wikipedia.org/wiki/Pointer_(computer_programming)\">pointers</a></em>,\nallowing you to pass references to values and records\nwithin your program.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/OlWCLpxAyBz\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll show how pointers work in contrast to values with\n2 functions: <code>zeroval</code> and <code>zeroptr</code>. <code>zeroval</code> has an\n<code>int</code> parameter, so arguments will be passed to it by\nvalue. <code>zeroval</code> will get a copy of <code>ival</code> distinct\nfrom the one in the calling function.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">zeroval</span><span class=\"p\">(</span><span class=\"nx\">ival</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ival</span> <span class=\"p\">=</span> <span class=\"mi\">0</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>zeroptr</code> in contrast has an <code>*int</code> parameter, meaning\nthat it takes an <code>int</code> pointer. The <code>*iptr</code> code in the\nfunction body then <em>dereferences</em> the pointer from its\nmemory address to the current value at that address.\nAssigning a value to a dereferenced pointer changes the\nvalue at the referenced address.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">zeroptr</span><span class=\"p\">(</span><span class=\"nx\">iptr</span> <span class=\"o\">*</span><span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"o\">*</span><span class=\"nx\">iptr</span> <span class=\"p\">=</span> <span class=\"mi\">0</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;initial:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">zeroval</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;zeroval:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>&amp;i</code> syntax gives the memory address of <code>i</code>,\ni.e. a pointer to <code>i</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">zeroptr</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;zeroptr:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Pointers can be printed too.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;pointer:&#34;</span><span class=\"p\">,</span> <span class=\"o\">&amp;</span><span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>zeroval</code> doesn&rsquo;t change the <code>i</code> in <code>main</code>, but\n<code>zeroptr</code> does because it has a reference to\nthe memory address for that variable.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run pointers.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">initial: 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">zeroval: 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">zeroptr: 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">pointer: 0x42131100</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"strings-and-runes\" rel=\"next\">Strings and Runes</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func zeroval(ival int) {\\u000A    ival \\u003D 0\\u000A}\\u000A');codeLines.push('func zeroptr(iptr *int) {\\u000A    *iptr \\u003D 0\\u000A}\\u000A');codeLines.push('func main() {\\u000A    i :\\u003D 1\\u000A    fmt.Println(\\\"initial:\\\", i)\\u000A');codeLines.push('    zeroval(i)\\u000A    fmt.Println(\\\"zeroval:\\\", i)\\u000A');codeLines.push('    zeroptr(\\u0026i)\\u000A    fmt.Println(\\\"zeroptr:\\\", i)\\u000A');codeLines.push('    fmt.Println(\\\"pointer:\\\", \\u0026i)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/random-numbers",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Random Numbers</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'time-formatting-parsing';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'number-parsing';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"random-numbers\">\n      <h2><a href=\"./\">Go by Example</a>: Random Numbers</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go&rsquo;s <code>math/rand/v2</code> package provides\n<a href=\"https://en.wikipedia.org/wiki/Pseudorandom_number_generator\">pseudorandom number</a>\ngeneration.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/TkgmNAl8euK\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;math/rand/v2&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For example, <code>rand.IntN</code> returns a random <code>int</code> n,\n<code>0 &lt;= n &lt; 100</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">IntN</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">),</span> <span class=\"s\">&#34;,&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">IntN</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>rand.Float64</code> returns a <code>float64</code> <code>f</code>,\n<code>0.0 &lt;= f &lt; 1.0</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">Float64</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This can be used to generate random floats in\nother ranges, for example <code>5.0 &lt;= f' &lt; 10.0</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">((</span><span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">Float64</span><span class=\"p\">()</span><span class=\"o\">*</span><span class=\"mi\">5</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"s\">&#34;,&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">((</span><span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">Float64</span><span class=\"p\">()</span> <span class=\"o\">*</span> <span class=\"mi\">5</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you want a known seed, create a new\n<code>rand.Source</code> and pass it into the <code>New</code>\nconstructor. <code>NewPCG</code> creates a new\n<a href=\"https://en.wikipedia.org/wiki/Permuted_congruential_generator\">PCG</a>\nsource that requires a seed of two <code>uint64</code>\nnumbers.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s2</span> <span class=\"o\">:=</span> <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">NewPCG</span><span class=\"p\">(</span><span class=\"mi\">42</span><span class=\"p\">,</span> <span class=\"mi\">1024</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r2</span> <span class=\"o\">:=</span> <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"nx\">s2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">r2</span><span class=\"p\">.</span><span class=\"nf\">IntN</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">),</span> <span class=\"s\">&#34;,&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">r2</span><span class=\"p\">.</span><span class=\"nf\">IntN</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s3</span> <span class=\"o\">:=</span> <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">NewPCG</span><span class=\"p\">(</span><span class=\"mi\">42</span><span class=\"p\">,</span> <span class=\"mi\">1024</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r3</span> <span class=\"o\">:=</span> <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"nx\">s3</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">r3</span><span class=\"p\">.</span><span class=\"nf\">IntN</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">),</span> <span class=\"s\">&#34;,&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">r3</span><span class=\"p\">.</span><span class=\"nf\">IntN</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Some of the generated numbers may be\ndifferent when you run the sample.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run random-numbers.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">68,56\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">0.8090228139659177\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5.840125017402497,6.937056298890035\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">94,49\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">94,49</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>See the <a href=\"https://pkg.go.dev/math/rand/v2\"><code>math/rand/v2</code></a>\npackage docs for references on other random quantities\nthat Go can provide.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"number-parsing\" rel=\"next\">Number Parsing</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"math/rand/v2\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    fmt.Print(rand.IntN(100), \\\",\\\")\\u000A    fmt.Print(rand.IntN(100))\\u000A    fmt.Println()\\u000A');codeLines.push('    fmt.Println(rand.Float64())\\u000A');codeLines.push('    fmt.Print((rand.Float64()*5)+5, \\\",\\\")\\u000A    fmt.Print((rand.Float64() * 5) + 5)\\u000A    fmt.Println()\\u000A');codeLines.push('    s2 :\\u003D rand.NewPCG(42, 1024)\\u000A    r2 :\\u003D rand.New(s2)\\u000A    fmt.Print(r2.IntN(100), \\\",\\\")\\u000A    fmt.Print(r2.IntN(100))\\u000A    fmt.Println()\\u000A');codeLines.push('    s3 :\\u003D rand.NewPCG(42, 1024)\\u000A    r3 :\\u003D rand.New(s3)\\u000A    fmt.Print(r3.IntN(100), \\\",\\\")\\u000A    fmt.Print(r3.IntN(100))\\u000A    fmt.Println()\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/range-over-built-in-types",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Range over Built-in Types</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'recursion';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'pointers';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"range-over-built-in-types\">\n      <h2><a href=\"./\">Go by Example</a>: Range over Built-in Types</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>range</em> iterates over elements in a variety of\nbuilt-in data structures. Let&rsquo;s see how to\nuse <code>range</code> with some of the data structures\nwe&rsquo;ve already learned.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/S171w0PjgsD\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we use <code>range</code> to sum the numbers in a slice.\nArrays work like this too.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">nums</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">sum</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">num</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">nums</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">sum</span> <span class=\"o\">+=</span> <span class=\"nx\">num</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sum:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">sum</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>range</code> on arrays and slices provides both the\nindex and value for each entry. Above we didn&rsquo;t\nneed the index, so we ignored it with the\nblank identifier <code>_</code>. Sometimes we actually want\nthe indexes though.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span><span class=\"p\">,</span> <span class=\"nx\">num</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">nums</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">num</span> <span class=\"o\">==</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;index:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>range</code> on map iterates over key/value pairs.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">kvs</span> <span class=\"o\">:=</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;a&#34;</span><span class=\"p\">:</span> <span class=\"s\">&#34;apple&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;b&#34;</span><span class=\"p\">:</span> <span class=\"s\">&#34;banana&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">k</span><span class=\"p\">,</span> <span class=\"nx\">v</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">kvs</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%s -&gt; %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">k</span><span class=\"p\">,</span> <span class=\"nx\">v</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>range</code> can also iterate over just the keys of a map.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">k</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">kvs</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;key:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">k</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>range</code> on strings iterates over Unicode code\npoints. The first value is the starting byte index\nof the <code>rune</code> and the second the <code>rune</code> itself.\nSee <a href=\"strings-and-runes\">Strings and Runes</a> for more\ndetails.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span><span class=\"p\">,</span> <span class=\"nx\">c</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"s\">&#34;go&#34;</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">,</span> <span class=\"nx\">c</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run range-over-built-in-types.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sum: 9\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">index: 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">a -&gt; apple\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">b -&gt; banana\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">key: a\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">key: b\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">0 103\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1 111</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"pointers\" rel=\"next\">Pointers</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    nums :\\u003D []int{2, 3, 4}\\u000A    sum :\\u003D 0\\u000A    for _, num :\\u003D range nums {\\u000A        sum +\\u003D num\\u000A    }\\u000A    fmt.Println(\\\"sum:\\\", sum)\\u000A');codeLines.push('    for i, num :\\u003D range nums {\\u000A        if num \\u003D\\u003D 3 {\\u000A            fmt.Println(\\\"index:\\\", i)\\u000A        }\\u000A    }\\u000A');codeLines.push('    kvs :\\u003D map[string]string{\\\"a\\\": \\\"apple\\\", \\\"b\\\": \\\"banana\\\"}\\u000A    for k, v :\\u003D range kvs {\\u000A        fmt.Printf(\\\"%s -\\u003E %s\\\\n\\\", k, v)\\u000A    }\\u000A');codeLines.push('    for k :\\u003D range kvs {\\u000A        fmt.Println(\\\"key:\\\", k)\\u000A    }\\u000A');codeLines.push('    for i, c :\\u003D range \\\"go\\\" {\\u000A        fmt.Println(i, c)\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/range-over-channels",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Range over Channels</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'closing-channels';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'timers';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"range-over-channels\">\n      <h2><a href=\"./\">Go by Example</a>: Range over Channels</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In a <a href=\"range-over-built-in-types\">previous</a> example we saw how <code>for</code> and\n<code>range</code> provide iteration over basic data structures.\nWe can also use this syntax to iterate over\nvalues received from a channel.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/8vAhX6eX1wy\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll iterate over 2 values in the <code>queue</code> channel.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">queue</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">queue</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;one&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">queue</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;two&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">close</span><span class=\"p\">(</span><span class=\"nx\">queue</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This <code>range</code> iterates over each element as it&rsquo;s\nreceived from <code>queue</code>. Because we <code>close</code>d the\nchannel above, the iteration terminates after\nreceiving the 2 elements.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">elem</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">queue</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">elem</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run range-over-channels.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">one\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">two</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This example also showed that it&rsquo;s possible to close\na non-empty channel but still have the remaining\nvalues be received.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"timers\" rel=\"next\">Timers</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    queue :\\u003D make(chan string, 2)\\u000A    queue \\u003C- \\\"one\\\"\\u000A    queue \\u003C- \\\"two\\\"\\u000A    close(queue)\\u000A');codeLines.push('    for elem :\\u003D range queue {\\u000A        fmt.Println(elem)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/range-over-iterators",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Range over Iterators</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'generics';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'errors';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"range-over-iterators\">\n      <h2><a href=\"./\">Go by Example</a>: Range over Iterators</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Starting with version 1.23, Go has added support for\n<a href=\"https://go.dev/blog/range-functions\">iterators</a>,\nwhich lets us range over pretty much anything!</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/lHX3uDqdfUB\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;iter&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;slices&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Let&rsquo;s look at the <code>List</code> type from the\n<a href=\"generics\">previous example</a> again. In that example\nwe had an <code>AllElements</code> method that returned a slice\nof all elements in the list. With Go iterators, we\ncan do it better - as shown below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"nx\">T</span> <span class=\"nx\">any</span><span class=\"p\">]</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">head</span><span class=\"p\">,</span> <span class=\"nx\">tail</span> <span class=\"o\">*</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span> <span class=\"nx\">any</span><span class=\"p\">]</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">next</span> <span class=\"o\">*</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">val</span>  <span class=\"nx\">T</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">lst</span> <span class=\"o\">*</span><span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">])</span> <span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"nx\">v</span> <span class=\"nx\">T</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span> <span class=\"o\">==</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">head</span> <span class=\"p\">=</span> <span class=\"o\">&amp;</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]{</span><span class=\"nx\">val</span><span class=\"p\">:</span> <span class=\"nx\">v</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span> <span class=\"p\">=</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">head</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span><span class=\"p\">.</span><span class=\"nx\">next</span> <span class=\"p\">=</span> <span class=\"o\">&amp;</span><span class=\"nx\">element</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]{</span><span class=\"nx\">val</span><span class=\"p\">:</span> <span class=\"nx\">v</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span> <span class=\"p\">=</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">tail</span><span class=\"p\">.</span><span class=\"nx\">next</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>All returns an <em>iterator</em>, which in Go is a function\nwith a <a href=\"https://pkg.go.dev/iter#Seq\">special signature</a>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">lst</span> <span class=\"o\">*</span><span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">])</span> <span class=\"nf\">All</span><span class=\"p\">()</span> <span class=\"nx\">iter</span><span class=\"p\">.</span><span class=\"nx\">Seq</span><span class=\"p\">[</span><span class=\"nx\">T</span><span class=\"p\">]</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">yield</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">T</span><span class=\"p\">)</span> <span class=\"kt\">bool</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The iterator function takes another function as\na parameter, called <code>yield</code> by convention (but\nthe name can be arbitrary). It will call <code>yield</code> for\nevery element we want to iterate over, and note <code>yield</code>&rsquo;s\nreturn value for a potential early termination.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"nx\">e</span> <span class=\"o\">:=</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nx\">head</span><span class=\"p\">;</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span><span class=\"p\">;</span> <span class=\"nx\">e</span> <span class=\"p\">=</span> <span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nx\">next</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">if</span> <span class=\"p\">!</span><span class=\"nf\">yield</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nx\">val</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"k\">return</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Iteration doesn&rsquo;t require an underlying data structure,\nand doesn&rsquo;t even have to be finite! Here&rsquo;s a function\nreturning an iterator over Fibonacci numbers: it keeps\nrunning as long as <code>yield</code> keeps returning <code>true</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">genFib</span><span class=\"p\">()</span> <span class=\"nx\">iter</span><span class=\"p\">.</span><span class=\"nx\">Seq</span><span class=\"p\">[</span><span class=\"kt\">int</span><span class=\"p\">]</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">yield</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">bool</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">1</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">if</span> <span class=\"p\">!</span><span class=\"nf\">yield</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"k\">return</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"p\">=</span> <span class=\"nx\">b</span><span class=\"p\">,</span> <span class=\"nx\">a</span><span class=\"o\">+</span><span class=\"nx\">b</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span> <span class=\"o\">:=</span> <span class=\"nx\">List</span><span class=\"p\">[</span><span class=\"kt\">int</span><span class=\"p\">]{}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"mi\">13</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">Push</span><span class=\"p\">(</span><span class=\"mi\">23</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Since <code>List.All</code> returns an iterator, we can use it\nin a regular <code>range</code> loop.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">e</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">All</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Packages like <a href=\"https://pkg.go.dev/slices\">slices</a> have\na number of useful functions to work with iterators.\nFor example, <code>Collect</code> takes any iterator and collects\nall its values into a slice.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">all</span> <span class=\"o\">:=</span> <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">Collect</span><span class=\"p\">(</span><span class=\"nx\">lst</span><span class=\"p\">.</span><span class=\"nf\">All</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;all:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">all</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Standard library packages now expose iterator helpers\ntoo. For example, <code>strings.SplitSeq</code> iterates over parts\nof a byte slice without first building a result slice.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">part</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">SplitSeq</span><span class=\"p\">(</span><span class=\"s\">&#34;go-by-example&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-&#34;</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;part: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">part</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">n</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nf\">genFib</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Once the loop hits <code>break</code> or an early return, the <code>yield</code> function\npassed to the iterator will return <code>false</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">n</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">break</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run range-over-iterators.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">10\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">13\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">23\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">all: [10 13 23]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">part: go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">part: by\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">part: example\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">8</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"errors\" rel=\"next\">Errors</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"iter\\\"\\u000A    \\\"slices\\\"\\u000A    \\\"strings\\\"\\u000A)\\u000A');codeLines.push('type List[T any] struct {\\u000A    head, tail *element[T]\\u000A}\\u000A');codeLines.push('type element[T any] struct {\\u000A    next *element[T]\\u000A    val  T\\u000A}\\u000A');codeLines.push('func (lst *List[T]) Push(v T) {\\u000A    if lst.tail \\u003D\\u003D nil {\\u000A        lst.head \\u003D \\u0026element[T]{val: v}\\u000A        lst.tail \\u003D lst.head\\u000A    } else {\\u000A        lst.tail.next \\u003D \\u0026element[T]{val: v}\\u000A        lst.tail \\u003D lst.tail.next\\u000A    }\\u000A}\\u000A');codeLines.push('func (lst *List[T]) All() iter.Seq[T] {\\u000A    return func(yield func(T) bool) {\\u000A');codeLines.push('        for e :\\u003D lst.head; e !\\u003D nil; e \\u003D e.next {\\u000A            if !yield(e.val) {\\u000A                return\\u000A            }\\u000A        }\\u000A    }\\u000A}\\u000A');codeLines.push('func genFib() iter.Seq[int] {\\u000A    return func(yield func(int) bool) {\\u000A        a, b :\\u003D 0, 1\\u000A');codeLines.push('        for {\\u000A            if !yield(a) {\\u000A                return\\u000A            }\\u000A            a, b \\u003D b, a+b\\u000A        }\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A    lst :\\u003D List[int]{}\\u000A    lst.Push(10)\\u000A    lst.Push(13)\\u000A    lst.Push(23)\\u000A');codeLines.push('    for e :\\u003D range lst.All() {\\u000A        fmt.Println(e)\\u000A    }\\u000A');codeLines.push('    all :\\u003D slices.Collect(lst.All())\\u000A    fmt.Println(\\\"all:\\\", all)\\u000A');codeLines.push('    for part :\\u003D range strings.SplitSeq(\\\"go-by-example\\\", \\\"-\\\") {\\u000A        fmt.Printf(\\\"part: %s\\\\n\\\", part)\\u000A    }\\u000A');codeLines.push('    for n :\\u003D range genFib() {\\u000A');codeLines.push('        if n \\u003E\\u003D 10 {\\u000A            break\\u000A        }\\u000A        fmt.Println(n)\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/rate-limiting",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Rate Limiting</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'waitgroups';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'atomic-counters';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"rate-limiting\">\n      <h2><a href=\"./\">Go by Example</a>: Rate Limiting</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"https://en.wikipedia.org/wiki/Rate_limiting\"><em>Rate limiting</em></a>\nis an important mechanism for controlling resource\nutilization and maintaining quality of service. Go\nelegantly supports rate limiting with goroutines,\nchannels, and <a href=\"tickers\">tickers</a>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/y9V3goQfy5m\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>First we&rsquo;ll look at basic rate limiting. Suppose\nwe want to limit our handling of incoming requests.\nWe&rsquo;ll serve these requests off a channel of the\nsame name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">requests</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">5</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">requests</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">i</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">close</span><span class=\"p\">(</span><span class=\"nx\">requests</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This <code>limiter</code> channel will receive a value\nevery 200 milliseconds. This is the regulator in\nour rate limiting scheme.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">limiter</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Tick</span><span class=\"p\">(</span><span class=\"mi\">200</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Millisecond</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By blocking on a receive from the <code>limiter</code> channel\nbefore serving each request, we limit ourselves to\n1 request every 200 milliseconds.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">req</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">requests</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"o\">&lt;-</span><span class=\"nx\">limiter</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;request&#34;</span><span class=\"p\">,</span> <span class=\"nx\">req</span><span class=\"p\">,</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We may want to allow short bursts of requests in\nour rate limiting scheme while preserving the\noverall rate limit. We can accomplish this by\nbuffering our limiter channel. This <code>burstyLimiter</code>\nchannel will allow bursts of up to 3 events.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">burstyLimiter</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Time</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Fill up the channel to represent allowed bursting.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">burstyLimiter</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Every 200 milliseconds we&rsquo;ll try to add a new\nvalue to <code>burstyLimiter</code>, up to its limit of 3.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"nx\">t</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Tick</span><span class=\"p\">(</span><span class=\"mi\">200</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Millisecond</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">burstyLimiter</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">t</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now simulate 5 more incoming requests. The first\n3 of these will benefit from the burst capability\nof <code>burstyLimiter</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">burstyRequests</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">5</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">burstyRequests</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">i</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">close</span><span class=\"p\">(</span><span class=\"nx\">burstyRequests</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">req</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">burstyRequests</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"o\">&lt;-</span><span class=\"nx\">burstyLimiter</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;request&#34;</span><span class=\"p\">,</span> <span class=\"nx\">req</span><span class=\"p\">,</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running our program we see the first batch of requests\nhandled once every ~200 milliseconds as desired.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run rate-limiting.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 1 2012-10-19 00:38:18.687438 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 2 2012-10-19 00:38:18.887471 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 3 2012-10-19 00:38:19.087238 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 4 2012-10-19 00:38:19.287338 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 5 2012-10-19 00:38:19.487331 +0000 UTC</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For the second batch of requests we serve the first\n3 immediately because of the burstable rate limiting,\nthen serve the remaining 2 with ~200ms delays each.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 1 2012-10-19 00:38:20.487578 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 2 2012-10-19 00:38:20.487645 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 3 2012-10-19 00:38:20.487676 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 4 2012-10-19 00:38:20.687483 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">request 5 2012-10-19 00:38:20.887542 +0000 UTC</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"atomic-counters\" rel=\"next\">Atomic Counters</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    requests :\\u003D make(chan int, 5)\\u000A    for i :\\u003D 1; i \\u003C\\u003D 5; i++ {\\u000A        requests \\u003C- i\\u000A    }\\u000A    close(requests)\\u000A');codeLines.push('    limiter :\\u003D time.Tick(200 * time.Millisecond)\\u000A');codeLines.push('    for req :\\u003D range requests {\\u000A        \\u003C-limiter\\u000A        fmt.Println(\\\"request\\\", req, time.Now())\\u000A    }\\u000A');codeLines.push('    burstyLimiter :\\u003D make(chan time.Time, 3)\\u000A');codeLines.push('    for range 3 {\\u000A        burstyLimiter \\u003C- time.Now()\\u000A    }\\u000A');codeLines.push('    go func() {\\u000A        for t :\\u003D range time.Tick(200 * time.Millisecond) {\\u000A            burstyLimiter \\u003C- t\\u000A        }\\u000A    }()\\u000A');codeLines.push('    burstyRequests :\\u003D make(chan int, 5)\\u000A    for i :\\u003D 1; i \\u003C\\u003D 5; i++ {\\u000A        burstyRequests \\u003C- i\\u000A    }\\u000A    close(burstyRequests)\\u000A    for req :\\u003D range burstyRequests {\\u000A        \\u003C-burstyLimiter\\u000A        fmt.Println(\\\"request\\\", req, time.Now())\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/reading-files",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Reading Files</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'base64-encoding';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'writing-files';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"reading-files\">\n      <h2><a href=\"./\">Go by Example</a>: Reading Files</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Reading and writing files are basic tasks needed for\nmany Go programs. First we&rsquo;ll look at some examples of\nreading files.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/J710-KJyC8z\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bufio&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;io&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Reading files requires checking most calls for errors.\nThis helper will streamline our error checks below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">e</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Perhaps the most basic file reading task is\nslurping a file&rsquo;s entire contents into memory.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">path</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">TempDir</span><span class=\"p\">(),</span> <span class=\"s\">&#34;dat&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dat</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">ReadFile</span><span class=\"p\">(</span><span class=\"nx\">path</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">dat</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You&rsquo;ll often want more control over how and what\nparts of a file are read. For these tasks, start\nby <code>Open</code>ing a file to obtain an <code>os.File</code> value.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Open</span><span class=\"p\">(</span><span class=\"nx\">path</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Read some bytes from the beginning of the file.\nAllow up to 5 to be read but also note how many\nactually were read.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b1</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">([]</span><span class=\"kt\">byte</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n1</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Read</span><span class=\"p\">(</span><span class=\"nx\">b1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%d bytes: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">n1</span><span class=\"p\">,</span> <span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">b1</span><span class=\"p\">[:</span><span class=\"nx\">n1</span><span class=\"p\">]))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also <code>Seek</code> to a known location in the file\nand <code>Read</code> from there.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">o2</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Seek</span><span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nx\">SeekStart</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b2</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">([]</span><span class=\"kt\">byte</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n2</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Read</span><span class=\"p\">(</span><span class=\"nx\">b2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%d bytes @ %d: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">n2</span><span class=\"p\">,</span> <span class=\"nx\">o2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%v\\n&#34;</span><span class=\"p\">,</span> <span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">b2</span><span class=\"p\">[:</span><span class=\"nx\">n2</span><span class=\"p\">]))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Other methods of seeking are relative to the\ncurrent cursor position,</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Seek</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nx\">SeekCurrent</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>and relative to the end of the file.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Seek</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nx\">SeekEnd</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>io</code> package provides some functions that may\nbe helpful for file reading. For example, reads\nlike the ones above can be more robustly\nimplemented with <code>ReadAtLeast</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">o3</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Seek</span><span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nx\">SeekStart</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b3</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">([]</span><span class=\"kt\">byte</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n3</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nf\">ReadAtLeast</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"nx\">b3</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%d bytes @ %d: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">n3</span><span class=\"p\">,</span> <span class=\"nx\">o3</span><span class=\"p\">,</span> <span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">b3</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>There is no built-in rewind, but\n<code>Seek(0, io.SeekStart)</code> accomplishes this.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Seek</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nx\">SeekStart</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>bufio</code> package implements a buffered\nreader that may be useful both for its efficiency\nwith many small reads and because of the additional\nreading methods it provides.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r4</span> <span class=\"o\">:=</span> <span class=\"nx\">bufio</span><span class=\"p\">.</span><span class=\"nf\">NewReader</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">b4</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">r4</span><span class=\"p\">.</span><span class=\"nf\">Peek</span><span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;5 bytes: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">b4</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Close the file when you&rsquo;re done (usually this would\nbe scheduled immediately after <code>Open</code>ing with\n<code>defer</code>).</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#34;hello&#34; &gt; /tmp/dat\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#34;go&#34; &gt;&gt;   /tmp/dat\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run reading-files.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5 bytes: hello\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2 bytes @ 6: go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2 bytes @ 6: go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5 bytes: hello</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at writing files.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"writing-files\" rel=\"next\">Writing Files</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bufio\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"io\\\"\\u000A    \\\"os\\\"\\u000A    \\\"path/filepath\\\"\\u000A)\\u000A');codeLines.push('func check(e error) {\\u000A    if e !\\u003D nil {\\u000A        panic(e)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    path :\\u003D filepath.Join(os.TempDir(), \\\"dat\\\")\\u000A    dat, err :\\u003D os.ReadFile(path)\\u000A    check(err)\\u000A    fmt.Print(string(dat))\\u000A');codeLines.push('    f, err :\\u003D os.Open(path)\\u000A    check(err)\\u000A');codeLines.push('    b1 :\\u003D make([]byte, 5)\\u000A    n1, err :\\u003D f.Read(b1)\\u000A    check(err)\\u000A    fmt.Printf(\\\"%d bytes: %s\\\\n\\\", n1, string(b1[:n1]))\\u000A');codeLines.push('    o2, err :\\u003D f.Seek(6, io.SeekStart)\\u000A    check(err)\\u000A    b2 :\\u003D make([]byte, 2)\\u000A    n2, err :\\u003D f.Read(b2)\\u000A    check(err)\\u000A    fmt.Printf(\\\"%d bytes @ %d: \\\", n2, o2)\\u000A    fmt.Printf(\\\"%v\\\\n\\\", string(b2[:n2]))\\u000A');codeLines.push('    _, err \\u003D f.Seek(2, io.SeekCurrent)\\u000A    check(err)\\u000A');codeLines.push('    _, err \\u003D f.Seek(-4, io.SeekEnd)\\u000A    check(err)\\u000A');codeLines.push('    o3, err :\\u003D f.Seek(6, io.SeekStart)\\u000A    check(err)\\u000A    b3 :\\u003D make([]byte, 2)\\u000A    n3, err :\\u003D io.ReadAtLeast(f, b3, 2)\\u000A    check(err)\\u000A    fmt.Printf(\\\"%d bytes @ %d: %s\\\\n\\\", n3, o3, string(b3))\\u000A');codeLines.push('    _, err \\u003D f.Seek(0, io.SeekStart)\\u000A    check(err)\\u000A');codeLines.push('    r4 :\\u003D bufio.NewReader(f)\\u000A    b4, err :\\u003D r4.Peek(5)\\u000A    check(err)\\u000A    fmt.Printf(\\\"5 bytes: %s\\\\n\\\", string(b4))\\u000A');codeLines.push('    f.Close()\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/recover",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Recover</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'defer';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'string-functions';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"recover\">\n      <h2><a href=\"./\">Go by Example</a>: Recover</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go makes it possible to <em>recover</em> from a panic, by\nusing the <code>recover</code> built-in function. A <code>recover</code> can\nstop a <code>panic</code> from aborting the program and let it\ncontinue with execution instead.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>An example of where this can be useful: a server\nwouldn&rsquo;t want to crash if one of the client connections\nexhibits a critical error. Instead, the server would\nwant to close that connection and continue serving\nother clients. In fact, this is what Go&rsquo;s <code>net/http</code>\ndoes by default for HTTP servers.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/Sk-SVdofEIZ\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This function panics.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">mayPanic</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"s\">&#34;a problem&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>recover</code> must be called within a deferred function.\nWhen the enclosing function panics, the defer will\nactivate and a <code>recover</code> call within it will catch\nthe panic.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The return value of <code>recover</code> is the error raised in\nthe call to <code>panic</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">r</span> <span class=\"o\">:=</span> <span class=\"nb\">recover</span><span class=\"p\">();</span> <span class=\"nx\">r</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Recovered. Error:\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">mayPanic</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This code will not run, because <code>mayPanic</code> panics.\nThe execution of <code>main</code> stops at the point of the\npanic and resumes in the deferred closure.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;After mayPanic()&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run recover.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Recovered. Error:\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> a problem</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"string-functions\" rel=\"next\">String Functions</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func mayPanic() {\\u000A    panic(\\\"a problem\\\")\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    defer func() {\\u000A        if r :\\u003D recover(); r !\\u003D nil {\\u000A');codeLines.push('            fmt.Println(\\\"Recovered. Error:\\\\n\\\", r)\\u000A        }\\u000A    }()\\u000A');codeLines.push('    mayPanic()\\u000A');codeLines.push('    fmt.Println(\\\"After mayPanic()\\\")\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/recursion",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Recursion</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'closures';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'range-over-built-in-types';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"recursion\">\n      <h2><a href=\"./\">Go by Example</a>: Recursion</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports\n<a href=\"https://en.wikipedia.org/wiki/Recursion_(computer_science)\"><em>recursive functions</em></a>.\nHere&rsquo;s a classic example.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/k4IRATLn9cE\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This <code>fact</code> function calls itself until it reaches the\nbase case of <code>fact(0)</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">fact</span><span class=\"p\">(</span><span class=\"nx\">n</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">n</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"mi\">1</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">n</span> <span class=\"o\">*</span> <span class=\"nf\">fact</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">fact</span><span class=\"p\">(</span><span class=\"mi\">7</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Anonymous functions can also be recursive, but this requires\nexplicitly declaring a variable with <code>var</code> to store\nthe function before it&rsquo;s defined.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">fib</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">n</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">int</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fib</span> <span class=\"p\">=</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">n</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">n</span> <span class=\"p\">&lt;</span> <span class=\"mi\">2</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">return</span> <span class=\"nx\">n</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Since <code>fib</code> was previously declared in <code>main</code>, Go\nknows which function to call with <code>fib</code> here.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nf\">fib</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"nf\">fib</span><span class=\"p\">(</span><span class=\"nx\">n</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">fib</span><span class=\"p\">(</span><span class=\"mi\">7</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run recursion.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5040\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">13</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"range-over-built-in-types\" rel=\"next\">Range over Built-in Types</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func fact(n int) int {\\u000A    if n \\u003D\\u003D 0 {\\u000A        return 1\\u000A    }\\u000A    return n * fact(n-1)\\u000A}\\u000A');codeLines.push('func main() {\\u000A    fmt.Println(fact(7))\\u000A');codeLines.push('    var fib func(n int) int\\u000A');codeLines.push('    fib \\u003D func(n int) int {\\u000A        if n \\u003C 2 {\\u000A            return n\\u000A        }\\u000A');codeLines.push('        return fib(n-1) + fib(n-2)\\u000A    }\\u000A');codeLines.push('    fmt.Println(fib(7))\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/regular-expressions",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Regular Expressions</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'text-templates';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'json';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"regular-expressions\">\n      <h2><a href=\"./\">Go by Example</a>: Regular Expressions</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers built-in support for <a href=\"https://en.wikipedia.org/wiki/Regular_expression\">regular expressions</a>.\nHere are some examples of  common regexp-related tasks\nin Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/fI2YIfYsCaL\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bytes&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;regexp&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This tests whether a pattern matches a string.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">match</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">regexp</span><span class=\"p\">.</span><span class=\"nf\">MatchString</span><span class=\"p\">(</span><span class=\"s\">&#34;p([a-z]+)ch&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;peach&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">match</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Above we used a string pattern directly, but for\nother regexp tasks you&rsquo;ll need to <code>Compile</code> an\noptimized <code>Regexp</code> struct.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">regexp</span><span class=\"p\">.</span><span class=\"nf\">Compile</span><span class=\"p\">(</span><span class=\"s\">&#34;p([a-z]+)ch&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Many methods are available on these structs. Here&rsquo;s\na match test like we saw earlier.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">MatchString</span><span class=\"p\">(</span><span class=\"s\">&#34;peach&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This finds the match for the regexp.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindString</span><span class=\"p\">(</span><span class=\"s\">&#34;peach punch&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This also finds the first match but returns the\nstart and end indexes for the match instead of the\nmatching text.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;idx:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindStringIndex</span><span class=\"p\">(</span><span class=\"s\">&#34;peach punch&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>Submatch</code> variants include information about\nboth the whole-pattern matches and the submatches\nwithin those matches. For example this will return\ninformation for both <code>p([a-z]+)ch</code> and <code>([a-z]+)</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindStringSubmatch</span><span class=\"p\">(</span><span class=\"s\">&#34;peach punch&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Similarly this will return information about the\nindexes of matches and submatches.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindStringSubmatchIndex</span><span class=\"p\">(</span><span class=\"s\">&#34;peach punch&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>All</code> variants of these functions apply to all\nmatches in the input, not just the first. For\nexample to find all matches for a regexp.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindAllString</span><span class=\"p\">(</span><span class=\"s\">&#34;peach punch pinch&#34;</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>These <code>All</code> variants are available for the other\nfunctions we saw above as well.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;all:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindAllStringSubmatchIndex</span><span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;peach punch pinch&#34;</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Providing a non-negative integer as the second\nargument to these functions will limit the number\nof matches.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">FindAllString</span><span class=\"p\">(</span><span class=\"s\">&#34;peach punch pinch&#34;</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Our examples above had string arguments and used\nnames like <code>MatchString</code>. We can also provide\n<code>[]byte</code> arguments and drop <code>String</code> from the\nfunction name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">Match</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"s\">&#34;peach&#34;</span><span class=\"p\">)))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When creating global variables with regular\nexpressions you can use the <code>MustCompile</code> variation\nof <code>Compile</code>. <code>MustCompile</code> panics instead of\nreturning an error, which makes it safer to use for\nglobal variables.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">r</span> <span class=\"p\">=</span> <span class=\"nx\">regexp</span><span class=\"p\">.</span><span class=\"nf\">MustCompile</span><span class=\"p\">(</span><span class=\"s\">&#34;p([a-z]+)ch&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;regexp:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">r</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>regexp</code> package can also be used to replace\nsubsets of strings with other values.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">ReplaceAllString</span><span class=\"p\">(</span><span class=\"s\">&#34;a peach&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;&lt;fruit&gt;&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>Func</code> variant allows you to transform matched\ntext with a given function.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">in</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"s\">&#34;a peach&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">out</span> <span class=\"o\">:=</span> <span class=\"nx\">r</span><span class=\"p\">.</span><span class=\"nf\">ReplaceAllFunc</span><span class=\"p\">(</span><span class=\"nx\">in</span><span class=\"p\">,</span> <span class=\"nx\">bytes</span><span class=\"p\">.</span><span class=\"nx\">ToUpper</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">out</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run regular-expressions.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">peach\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">idx: [0 5]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[peach ea]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[0 5 1 3]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[peach punch pinch]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">all: [[0 5 1 3] [6 11 7 9] [12 17 13 15]]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[peach punch]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">regexp: p([a-z]+)ch\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">a &lt;fruit&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">a PEACH</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For a complete reference on Go regular expressions check\nthe <a href=\"https://pkg.go.dev/regexp\"><code>regexp</code></a> package docs.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"json\" rel=\"next\">JSON</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bytes\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"regexp\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    match, _ :\\u003D regexp.MatchString(\\\"p([a-z]+)ch\\\", \\\"peach\\\")\\u000A    fmt.Println(match)\\u000A');codeLines.push('    r, _ :\\u003D regexp.Compile(\\\"p([a-z]+)ch\\\")\\u000A');codeLines.push('    fmt.Println(r.MatchString(\\\"peach\\\"))\\u000A');codeLines.push('    fmt.Println(r.FindString(\\\"peach punch\\\"))\\u000A');codeLines.push('    fmt.Println(\\\"idx:\\\", r.FindStringIndex(\\\"peach punch\\\"))\\u000A');codeLines.push('    fmt.Println(r.FindStringSubmatch(\\\"peach punch\\\"))\\u000A');codeLines.push('    fmt.Println(r.FindStringSubmatchIndex(\\\"peach punch\\\"))\\u000A');codeLines.push('    fmt.Println(r.FindAllString(\\\"peach punch pinch\\\", -1))\\u000A');codeLines.push('    fmt.Println(\\\"all:\\\", r.FindAllStringSubmatchIndex(\\u000A        \\\"peach punch pinch\\\", -1))\\u000A');codeLines.push('    fmt.Println(r.FindAllString(\\\"peach punch pinch\\\", 2))\\u000A');codeLines.push('    fmt.Println(r.Match([]byte(\\\"peach\\\")))\\u000A');codeLines.push('    r \\u003D regexp.MustCompile(\\\"p([a-z]+)ch\\\")\\u000A    fmt.Println(\\\"regexp:\\\", r)\\u000A');codeLines.push('    fmt.Println(r.ReplaceAllString(\\\"a peach\\\", \\\"\\u003Cfruit\\u003E\\\"))\\u000A');codeLines.push('    in :\\u003D []byte(\\\"a peach\\\")\\u000A    out :\\u003D r.ReplaceAllFunc(in, bytes.ToUpper)\\u000A    fmt.Println(string(out))\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/select",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Select</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'channel-directions';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'timeouts';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"select\">\n      <h2><a href=\"./\">Go by Example</a>: Select</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go&rsquo;s <em>select</em> lets you wait on multiple channel\noperations. Combining goroutines and channels with\nselect is a powerful feature of Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/dOrjUfgGwB2\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For our example we&rsquo;ll select across two channels.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c1</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c2</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Each channel will receive a value after some amount\nof time, to simulate e.g. blocking RPC operations\nexecuting in concurrent goroutines.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">c1</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;one&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">c2</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;two&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll use <code>select</code> to await both of these values\nsimultaneously, printing each one as it arrives.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"mi\">2</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">case</span> <span class=\"nx\">msg1</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">c1</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received&#34;</span><span class=\"p\">,</span> <span class=\"nx\">msg1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">case</span> <span class=\"nx\">msg2</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">c2</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;received&#34;</span><span class=\"p\">,</span> <span class=\"nx\">msg2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We receive the values <code>&quot;one&quot;</code> and then <code>&quot;two&quot;</code> as\nexpected.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> time go run select.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received one\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">received two</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that the total execution time is only ~2 seconds\nsince both the 1 and 2 second <code>Sleeps</code> execute\nconcurrently.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">real    0m2.245s</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"timeouts\" rel=\"next\">Timeouts</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    c1 :\\u003D make(chan string)\\u000A    c2 :\\u003D make(chan string)\\u000A');codeLines.push('    go func() {\\u000A        time.Sleep(1 * time.Second)\\u000A        c1 \\u003C- \\\"one\\\"\\u000A    }()\\u000A    go func() {\\u000A        time.Sleep(2 * time.Second)\\u000A        c2 \\u003C- \\\"two\\\"\\u000A    }()\\u000A');codeLines.push('    for range 2 {\\u000A        select {\\u000A        case msg1 :\\u003D \\u003C-c1:\\u000A            fmt.Println(\\\"received\\\", msg1)\\u000A        case msg2 :\\u003D \\u003C-c2:\\u000A            fmt.Println(\\\"received\\\", msg2)\\u000A        }\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/sha256-hashes",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: SHA256 Hashes</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'url-parsing';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'base64-encoding';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"sha256-hashes\">\n      <h2><a href=\"./\">Go by Example</a>: SHA256 Hashes</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"https://en.wikipedia.org/wiki/SHA-2\"><em>SHA256 hashes</em></a> are\nfrequently used to compute short identities for binary\nor text blobs. For example, TLS/SSL certificates use SHA256\nto compute a certificate&rsquo;s signature. Here&rsquo;s how to compute\nSHA256 hashes in Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/IHM1lZVm_Jm\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go implements several hash functions in various\n<code>crypto/*</code> packages.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;crypto/sha256&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;sha256 this string&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we start with a new hash.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">h</span> <span class=\"o\">:=</span> <span class=\"nx\">sha256</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Write</code> expects bytes. If you have a string <code>s</code>,\nuse <code>[]byte(s)</code> to coerce it to bytes.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">h</span><span class=\"p\">.</span><span class=\"nf\">Write</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This gets the finalized hash result as a byte\nslice. The argument to <code>Sum</code> can be used to append\nto an existing byte slice: it usually isn&rsquo;t needed.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">bs</span> <span class=\"o\">:=</span> <span class=\"nx\">h</span><span class=\"p\">.</span><span class=\"nf\">Sum</span><span class=\"p\">(</span><span class=\"kc\">nil</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%x\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">bs</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running the program computes the hash and prints it in\na human-readable hex format.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run sha256-hashes.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sha256 this string\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1af1dfa857bf1d8814fe1af8983c18080019922e557f15a8a...</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can compute other hashes using a similar pattern to\nthe one shown above. For example, to compute\nSHA512 hashes import <code>crypto/sha512</code> and use\n<code>sha512.New()</code>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that if you need cryptographically secure hashes,\nyou should carefully research\n<a href=\"https://en.wikipedia.org/wiki/Cryptographic_hash_function\">hash strength</a>!</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"base64-encoding\" rel=\"next\">Base64 Encoding</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"crypto/sha256\\\"\\u000A    \\\"fmt\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A    s :\\u003D \\\"sha256 this string\\\"\\u000A');codeLines.push('    h :\\u003D sha256.New()\\u000A');codeLines.push('    h.Write([]byte(s))\\u000A');codeLines.push('    bs :\\u003D h.Sum(nil)\\u000A');codeLines.push('    fmt.Println(s)\\u000A    fmt.Printf(\\\"%x\\\\n\\\", bs)\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/signals",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Signals</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'execing-processes';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'exit';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"signals\">\n      <h2><a href=\"./\">Go by Example</a>: Signals</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sometimes we&rsquo;d like our Go programs to intelligently\nhandle <a href=\"https://en.wikipedia.org/wiki/Unix_signal\">Unix signals</a>.\nFor example, we might want a server to gracefully\nshutdown when it receives a <code>SIGTERM</code>, or a command-line\ntool to stop processing input if it receives a <code>SIGINT</code>.\nHere&rsquo;s a modern way to handle signals using contexts.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/F3Wm7JT8wgn\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;context&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os/signal&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;syscall&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>signal.NotifyContext</code> returns a context that&rsquo;s canceled\nwhen one of the listed signals arrives.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ctx</span><span class=\"p\">,</span> <span class=\"nx\">stop</span> <span class=\"o\">:=</span> <span class=\"nx\">signal</span><span class=\"p\">.</span><span class=\"nf\">NotifyContext</span><span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">context</span><span class=\"p\">.</span><span class=\"nf\">Background</span><span class=\"p\">(),</span> <span class=\"nx\">syscall</span><span class=\"p\">.</span><span class=\"nx\">SIGINT</span><span class=\"p\">,</span> <span class=\"nx\">syscall</span><span class=\"p\">.</span><span class=\"nx\">SIGTERM</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nf\">stop</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The program will wait here until one of the\nconfigured signals is received.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;awaiting signal&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"o\">&lt;-</span><span class=\"nx\">ctx</span><span class=\"p\">.</span><span class=\"nf\">Done</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>context.Cause</code> reports why the context was canceled.\nFor a signal-triggered cancellation, this includes\nthe signal value.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">context</span><span class=\"p\">.</span><span class=\"nf\">Cause</span><span class=\"p\">(</span><span class=\"nx\">ctx</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;exiting&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When we run this program it will block waiting for a\nsignal. By typing <code>ctrl-C</code> (which the\nterminal shows as <code>^C</code>) we can send a <code>SIGINT</code> signal,\ncausing the program to print the cancellation cause and then exit.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run signals.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">awaiting signal\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">^C\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">interrupt signal received\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">exiting</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"exit\" rel=\"next\">Exit</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"context\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"os/signal\\\"\\u000A    \\\"syscall\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    ctx, stop :\\u003D signal.NotifyContext(\\u000A        context.Background(), syscall.SIGINT, syscall.SIGTERM)\\u000A    defer stop()\\u000A');codeLines.push('    fmt.Println(\\\"awaiting signal\\\")\\u000A    \\u003C-ctx.Done()\\u000A');codeLines.push('    fmt.Println()\\u000A    fmt.Println(context.Cause(ctx))\\u000A    fmt.Println(\\\"exiting\\\")\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/site.css",
    "content": "/* CSS reset: https://meyerweb.com/eric/tools/css/reset/ */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  font-size: 100%;\n  font: inherit;\n  vertical-align: baseline;\n}\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n  display: block;\n}\nbody {\n  line-height: 1;\n}\nol, ul {\n  list-style: none;\n}\nblockquote, q {\n  quotes: none;\n}\nblockquote:before, blockquote:after,\nq:before, q:after {\n  content: '';\n  content: none;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n\n/* Layout and typography */\nbody {\n  font-family: 'Georgia', serif;\n  font-size: 16px;\n  line-height: 20px;\n}\nem {\n  font-style: italic;\n}\nh2 {\n  font-size: 32px;\n  line-height: 40px;\n  margin-top: 40px;\n}\nh2 a {\n  text-decoration: none;\n}\ndiv.example {\n  width: 995px;\n  max-width: calc(100% - 24px);\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 120px;\n}\ndiv.example table {\n  margin-top: 15px;\n  margin-bottom: 20px;\n}\np.next {\n  margin-bottom: 20px;\n}\np.footer {\n  font-size: 75%;\n}\ndiv#intro {\n  width: 420px;\n  min-width: 420px;\n  max-width: 420px;\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 120px;\n}\ndiv#intro p {\n  padding-top: 20px;\n}\ndiv#intro ul {\n  padding-top: 20px;\n}\ntable td {\n  border: 0;\n  outline: 0;\n}\ntd.docs {\n  width: 420px;\n  max-width: 420px;\n  min-width: 420px;\n  min-height: 5px;\n  vertical-align: top;\n  text-align: left;\n}\ntd.docs p {\n  padding-right: 5px;\n  padding-top: 5px;\n  padding-bottom: 15px;\n}\ntd.code {\n  width: 575px;\n  max-width: 575px;\n  min-width: 575px;\n  padding-top: 5px;\n  padding-right: 5px;\n  padding-left: 5px;\n  padding-bottom: 5px;\n  vertical-align: top;\n}\ntd.code.leading {\n  padding-bottom: 11px;\n}\npre, code {\n  font-size: 14px; line-height: 18px;\n  font-family: 'Menlo', 'Monaco', 'Consolas', 'Lucida Console', monospace;\n}\nimg.copy, img.run {\n  height: 16px;\n  width: 16px;\n  float: right\n}\nimg.copy, img.run {\n  cursor: pointer;\n}\nimg.copy {\n  margin-right: 4px;\n}\n\n\n/* Colors: light mode */\nbody {\n  background-color: #ffffff;\n  color: #252519;\n}\ntd.code.empty {\n  background: #ffffff;\n}\na, a:visited {\n  color: #261a3b;\n}\np.footer {\n  color: #808080;\n}\np.footer a, p.footer a:visited {\n  color: #808080;\n}\ntd.code {\n  background: #f0f0f0;\n}\n\n/* Syntax highlighting: light mode */\nbody .nx { }                 /* Name.Other: package, variable, struct, param, generic type names, etc. */\nbody .nf { }                 /* Name.Function: function names (def and call) */\nbody .o  { }                 /* Operator: :=, &, *, +, &&, <, etc. */\nbody .p  { }                 /* Plain: = , . : [ ( { etc. */\nbody .k  { color: #954121 }  /* Keyword: if, for, range, return, defer, etc.  */\nbody .kc { color: #954121 }  /* Keyword.Constant: nil, true, false */\nbody .kd { color: #954121 }  /* Keyword.Declaration: func, var, type, struct, map, chan, etc. */\nbody .kn { color: #954121 }  /* Keyword.Namespace: package, import */\nbody .nb { color: #954121 }  /* Name.Builtin: make, len, delete, append, etc. */\nbody .kt { color: #b00040 }  /* Keyword.Type: string, int, byte, error, etc. */\nbody .m  { color: #666666 }  /* Literal.Number */\nbody .mf { color: #666666 }  /* Literal.Number.Float */\nbody .mh { color: #666666 }  /* Literal.Number.Hex */\nbody .mi { color: #666666 }  /* Literal.Number.Integer */\nbody .mo { color: #666666 }  /* Literal.Number.Oct */\nbody .s  { color: #219161 }  /* Literal.String */\nbody .sc { color: #219161 }  /* Literal.String.Char */\nbody .gp { color: #000080 }  /* Generic.Prompt: shell prompt */\nbody .go { color: #808080 }  /* Generic.Output: shell output */\nbody .c1 { color: #808080 }  /* Comment.Single */\n\n\n@media (prefers-color-scheme: dark) {\n  /* Colors: dark mode */\n  body {\n    background-color: #1f1f1f;\n    color: #dadada;\n  }\n  td.code.empty {\n    background: #1f1f1f;\n  }\n  a, a:visited {\n    color: #e4e4e4;\n  }\n  p.footer {\n    color: #898e98;\n  }\n  p.footer a, p.footer a:visited {\n    color: #898e98;\n  }\n  td.code {\n    background: #282828;\n  }\n\n \n  /* Syntax highlighting: dark mode */\n  body .nx { }                 /* Name.Other */\n  body .nf { }                 /* Name.Function */\n  body .o  { }                 /* Operator */\n  body .p  { }                 /* Plain */\n  body .k  { color: #af5a54 }  /* Keyword */\n  body .kc { color: #af5a54 }  /* Keyword.Constant */\n  body .kd { color: #af5a54 }  /* Keyword.Declaration */\n  body .kn { color: #af5a54 }  /* Keyword.Namespace */\n  body .nb { color: #af5a54 }  /* Name.Builtin */\n  body .kt { color: #b64343 }  /* Keyword.Type */\n  body .m  { color: #688ec8 }  /* Literal.Number */\n  body .mf { color: #688ec8 }  /* Literal.Number.Float */\n  body .mh { color: #688ec8 }  /* Literal.Number.Hex */\n  body .mi { color: #688ec8 }  /* Literal.Number.Integer */\n  body .mo { color: #688ec8 }  /* Literal.Number.Oct */\n  body .s  { color: #718e72 }  /* Literal.String */\n  body .sc { color: #718e72 }  /* Literal.String.Char */\n  body .gp { color: #8a6ab1 }  /* Generic.Prompt */\n  body .go { color: #868686 }  /* Generic.Output */\n  body .c1 { color: #868686 }  /* Comment.Single */\n}\n"
  },
  {
    "path": "public/site.js",
    "content": "/*!\r\n * clipboard.js v1.5.13\r\n * https://zenorocha.github.io/clipboard.js\r\n *\r\n * Licensed MIT © Zeno Rocha\r\n */\r\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var e;e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function r(c,a){if(!n[c]){if(!e[c]){var l=\"function\"==typeof require&&require;if(!a&&l)return l(c,!0);if(i)return i(c,!0);var s=new Error(\"Cannot find module '\"+c+\"'\");throw s.code=\"MODULE_NOT_FOUND\",s}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return r(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var i=\"function\"==typeof require&&require,c=0;c<o.length;c++)r(o[c]);return r}({1:[function(t,e,n){function o(t,e,n){for(n=n||document.documentElement;t&&t!==n;){if(r(t,e))return t;t=t.parentNode}return r(t,e)?t:null}try{var r=t(\"matches-selector\")}catch(e){var r=t(\"component-matches-selector\")}e.exports=o},{\"component-matches-selector\":2,\"matches-selector\":2}],2:[function(t,e,n){function o(t,e){if(!t||1!==t.nodeType)return!1;if(c)return c.call(t,e);for(var n=r.all(e,t.parentNode),o=0;o<n.length;++o)if(n[o]==t)return!0;return!1}try{var r=t(\"query\")}catch(e){var r=t(\"component-query\")}var i=Element.prototype,c=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector;e.exports=o},{\"component-query\":3,query:3}],3:[function(t,e,n){function o(t,e){return e.querySelector(t)}n=e.exports=function(t,e){return e=e||document,o(t,e)},n.all=function(t,e){return e=e||document,e.querySelectorAll(t)},n.engine=function(t){if(!t.one)throw new Error(\".one callback required\");if(!t.all)throw new Error(\".all callback required\");return o=t.one,n.all=t.all,n}},{}],4:[function(t,e,n){function o(t,e,n,o,i){var c=r.apply(this,arguments);return t.addEventListener(n,c,i),{destroy:function(){t.removeEventListener(n,c,i)}}}function r(t,e,n,o){return function(n){n.delegateTarget=i(n.target,e,!0),n.delegateTarget&&o.call(t,n)}}var i=t(\"component-closest\");e.exports=o},{\"component-closest\":1}],5:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&(\"[object NodeList]\"===e||\"[object HTMLCollection]\"===e)&&\"length\"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return\"string\"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return\"[object Function]\"===e}},{}],6:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error(\"Missing required arguments\");if(!a.string(e))throw new TypeError(\"Second argument must be a String\");if(!a.fn(n))throw new TypeError(\"Third argument must be a Function\");if(a.node(t))return r(t,e,n);if(a.nodeList(t))return i(t,e,n);if(a.string(t))return c(t,e,n);throw new TypeError(\"First argument must be a String, HTMLElement, HTMLCollection, or NodeList\")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function c(t,e,n){return l(document.body,t,e,n)}var a=t(\"./is\"),l=t(\"delegate\");e.exports=o},{\"./is\":5,delegate:4}],7:[function(t,e,n){function o(t){var e;if(\"SELECT\"===t.nodeName)t.focus(),e=t.value;else if(\"INPUT\"===t.nodeName||\"TEXTAREA\"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute(\"contenteditable\")&&t.focus();var n=window.getSelection(),o=document.createRange();o.selectNodeContents(t),n.removeAllRanges(),n.addRange(o),e=n.toString()}return e}e.exports=o},{}],8:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,c=o.length;i<c;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},e.exports=o},{}],9:[function(e,n,o){!function(r,i){if(\"function\"==typeof t&&t.amd)t([\"module\",\"select\"],i);else if(\"undefined\"!=typeof o)i(n,e(\"select\"));else{var c={exports:{}};i(c,r.select),r.clipboardAction=c.exports}}(this,function(t,e){\"use strict\";function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}var r=n(e),i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol?\"symbol\":typeof t},c=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),a=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=\"\"},t.prototype.initSelection=function t(){this.text?this.selectFake():this.target&&this.selectTarget()},t.prototype.selectFake=function t(){var e=this,n=\"rtl\"==document.documentElement.getAttribute(\"dir\");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=document.body.addEventListener(\"click\",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement(\"textarea\"),this.fakeElem.style.fontSize=\"12pt\",this.fakeElem.style.border=\"0\",this.fakeElem.style.padding=\"0\",this.fakeElem.style.margin=\"0\",this.fakeElem.style.position=\"absolute\",this.fakeElem.style[n?\"right\":\"left\"]=\"-9999px\";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.addEventListener(\"focus\",window.scrollTo(0,o)),this.fakeElem.style.top=o+\"px\",this.fakeElem.setAttribute(\"readonly\",\"\"),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()},t.prototype.removeFake=function t(){this.fakeHandler&&(document.body.removeEventListener(\"click\",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function t(){this.selectedText=(0,r.default)(this.target),this.copyText()},t.prototype.copyText=function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)},t.prototype.handleResult=function t(e){this.emitter.emit(e?\"success\":\"error\",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function t(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function t(){this.removeFake()},c(t,[{key:\"action\",set:function t(){var e=arguments.length<=0||void 0===arguments[0]?\"copy\":arguments[0];if(this._action=e,\"copy\"!==this._action&&\"cut\"!==this._action)throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"')},get:function t(){return this._action}},{key:\"target\",set:function t(e){if(void 0!==e){if(!e||\"object\"!==(\"undefined\"==typeof e?\"undefined\":i(e))||1!==e.nodeType)throw new Error('Invalid \"target\" value, use a valid Element');if(\"copy\"===this.action&&e.hasAttribute(\"disabled\"))throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');if(\"cut\"===this.action&&(e.hasAttribute(\"readonly\")||e.hasAttribute(\"disabled\")))throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=a})},{select:7}],10:[function(e,n,o){!function(r,i){if(\"function\"==typeof t&&t.amd)t([\"module\",\"./clipboard-action\",\"tiny-emitter\",\"good-listener\"],i);else if(\"undefined\"!=typeof o)i(n,e(\"./clipboard-action\"),e(\"tiny-emitter\"),e(\"good-listener\"));else{var c={exports:{}};i(c,r.clipboardAction,r.tinyEmitter,r.goodListener),r.clipboard=c.exports}}(this,function(t,e,n,o){\"use strict\";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function c(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}function a(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n=\"data-clipboard-\"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=r(e),u=r(n),f=r(o),d=function(t){function e(n,o){i(this,e);var r=c(this,t.call(this));return r.resolveOptions(o),r.listenClick(n),r}return a(e,t),e.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=\"function\"==typeof e.action?e.action:this.defaultAction,this.target=\"function\"==typeof e.target?e.target:this.defaultTarget,this.text=\"function\"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function t(e){var n=this;this.listener=(0,f.default)(e,\"click\",function(t){return n.onClick(t)})},e.prototype.onClick=function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function t(e){return l(\"action\",e)},e.prototype.defaultTarget=function t(e){var n=l(\"target\",e);if(n)return document.querySelector(n)},e.prototype.defaultText=function t(e){return l(\"text\",e)},e.prototype.destroy=function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(u.default);t.exports=d})},{\"./clipboard-action\":9,\"good-listener\":6,\"tiny-emitter\":8}]},{},[10])(10)});\r\n\r\n/*\r\n* code for the clipboard functionality\r\n*/\r\n\r\nvar clipboard = new Clipboard('.copy', {\r\n    text: function(trigger) {\r\n        return codeLines.filter(function(cL) { return cL != '' }).join(\"\\n\").replace(/\\n$/, '');\r\n    }\r\n});\r\n"
  },
  {
    "path": "public/slices",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Slices</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'arrays';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'maps';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"slices\">\n      <h2><a href=\"./\">Go by Example</a>: Slices</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Slices</em> are an important data type in Go, giving\na more powerful interface to sequences than arrays.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/9-U3-8sKQun\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;slices&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Unlike arrays, slices are typed only by the\nelements they contain (not the number of elements).\nAn uninitialized slice equals to nil and has\nlength 0.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">s</span> <span class=\"p\">[]</span><span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;uninit:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">,</span> <span class=\"nx\">s</span> <span class=\"o\">==</span> <span class=\"kc\">nil</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To create a slice with non-zero length, use\nthe builtin <code>make</code>. Here we make a slice of\n<code>string</code>s of length <code>3</code> (initially zero-valued).\nBy default a new slice&rsquo;s capacity is equal to its\nlength; if we know the slice is going to grow ahead\nof time, it&rsquo;s possible to pass a capacity explicitly\nas an additional parameter to <code>make</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"p\">=</span> <span class=\"nb\">make</span><span class=\"p\">([]</span><span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;emp:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">,</span> <span class=\"s\">&#34;len:&#34;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">),</span> <span class=\"s\">&#34;cap:&#34;</span><span class=\"p\">,</span> <span class=\"nb\">cap</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can set and get just like with arrays.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"s\">&#34;a&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"s\">&#34;b&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"s\">&#34;c&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;set:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;get:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">])</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>len</code> returns the length of the slice as expected.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;len:&#34;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In addition to these basic operations, slices\nsupport several more that make them richer than\narrays. One is the builtin <code>append</code>, which\nreturns a slice containing one or more new values.\nNote that we need to accept a return value from\n<code>append</code> as we may get a new slice value.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"p\">=</span> <span class=\"nb\">append</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">,</span> <span class=\"s\">&#34;d&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"p\">=</span> <span class=\"nb\">append</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">,</span> <span class=\"s\">&#34;e&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;f&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;apd:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Slices can also be <code>copy</code>&rsquo;d. Here we create an\nempty slice <code>c</code> of the same length as <code>s</code> and copy\ninto <code>c</code> from <code>s</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">([]</span><span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">copy</span><span class=\"p\">(</span><span class=\"nx\">c</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;cpy:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">c</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Slices support a &ldquo;slice&rdquo; operator with the syntax\n<code>slice[low:high]</code>. For example, this gets a slice\nof the elements <code>s[2]</code>, <code>s[3]</code>, and <code>s[4]</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">l</span> <span class=\"o\">:=</span> <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sl1:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">l</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This slices up to (but excluding) <code>s[5]</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">l</span> <span class=\"p\">=</span> <span class=\"nx\">s</span><span class=\"p\">[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sl2:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">l</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>And this slices up from (and including) <code>s[2]</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">l</span> <span class=\"p\">=</span> <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:]</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;sl3:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">l</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can declare and initialize a variable for slice\nin a single line as well.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;g&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;h&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;i&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;dcl:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">t</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>slices</code> package contains a number of useful\nutility functions for slices.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t2</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;g&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;h&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;i&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">Equal</span><span class=\"p\">(</span><span class=\"nx\">t</span><span class=\"p\">,</span> <span class=\"nx\">t2</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;t == t2&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Slices can be composed into multi-dimensional data\nstructures. The length of the inner slices can\nvary, unlike with multi-dimensional arrays.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">twoD</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">([][]</span><span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"mi\">3</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">innerLen</span> <span class=\"o\">:=</span> <span class=\"nx\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">twoD</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"nb\">make</span><span class=\"p\">([]</span><span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"nx\">innerLen</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"nx\">j</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">innerLen</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">twoD</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">][</span><span class=\"nx\">j</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"nx\">i</span> <span class=\"o\">+</span> <span class=\"nx\">j</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;2d: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">twoD</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that while slices are different types than arrays,\nthey are rendered similarly by <code>fmt.Println</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run slices.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">uninit: [] true true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">emp: [  ] len: 3 cap: 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">set: [a b c]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">get: c\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">len: 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">apd: [a b c d e f]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">cpy: [a b c d e f]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sl1: [c d e]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sl2: [a b c d e]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sl3: [c d e f]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">dcl: [g h i]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">t == t2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2d:  [[0] [1 2] [2 3 4]]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Check out this <a href=\"https://go.dev/blog/slices-intro\">great blog post</a>\nby the Go team for more details on the design and\nimplementation of slices in Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now that we&rsquo;ve seen arrays and slices we&rsquo;ll look at\nGo&rsquo;s other key builtin data structure: maps.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"maps\" rel=\"next\">Maps</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"slices\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    var s []string\\u000A    fmt.Println(\\\"uninit:\\\", s, s \\u003D\\u003D nil, len(s) \\u003D\\u003D 0)\\u000A');codeLines.push('    s \\u003D make([]string, 3)\\u000A    fmt.Println(\\\"emp:\\\", s, \\\"len:\\\", len(s), \\\"cap:\\\", cap(s))\\u000A');codeLines.push('    s[0] \\u003D \\\"a\\\"\\u000A    s[1] \\u003D \\\"b\\\"\\u000A    s[2] \\u003D \\\"c\\\"\\u000A    fmt.Println(\\\"set:\\\", s)\\u000A    fmt.Println(\\\"get:\\\", s[2])\\u000A');codeLines.push('    fmt.Println(\\\"len:\\\", len(s))\\u000A');codeLines.push('    s \\u003D append(s, \\\"d\\\")\\u000A    s \\u003D append(s, \\\"e\\\", \\\"f\\\")\\u000A    fmt.Println(\\\"apd:\\\", s)\\u000A');codeLines.push('    c :\\u003D make([]string, len(s))\\u000A    copy(c, s)\\u000A    fmt.Println(\\\"cpy:\\\", c)\\u000A');codeLines.push('    l :\\u003D s[2:5]\\u000A    fmt.Println(\\\"sl1:\\\", l)\\u000A');codeLines.push('    l \\u003D s[:5]\\u000A    fmt.Println(\\\"sl2:\\\", l)\\u000A');codeLines.push('    l \\u003D s[2:]\\u000A    fmt.Println(\\\"sl3:\\\", l)\\u000A');codeLines.push('    t :\\u003D []string{\\\"g\\\", \\\"h\\\", \\\"i\\\"}\\u000A    fmt.Println(\\\"dcl:\\\", t)\\u000A');codeLines.push('    t2 :\\u003D []string{\\\"g\\\", \\\"h\\\", \\\"i\\\"}\\u000A    if slices.Equal(t, t2) {\\u000A        fmt.Println(\\\"t \\u003D\\u003D t2\\\")\\u000A    }\\u000A');codeLines.push('    twoD :\\u003D make([][]int, 3)\\u000A    for i :\\u003D range 3 {\\u000A        innerLen :\\u003D i + 1\\u000A        twoD[i] \\u003D make([]int, innerLen)\\u000A        for j :\\u003D range innerLen {\\u000A            twoD[i][j] \\u003D i + j\\u000A        }\\u000A    }\\u000A    fmt.Println(\\\"2d: \\\", twoD)\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/sorting",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Sorting</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'stateful-goroutines';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'sorting-by-functions';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"sorting\">\n      <h2><a href=\"./\">Go by Example</a>: Sorting</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go&rsquo;s <code>slices</code> package implements sorting for builtins\nand user-defined types. We&rsquo;ll look at sorting for\nbuiltins first.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/X7iJcIua02T\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;slices&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sorting functions are generic, and work for any\n<em>ordered</em> built-in type. For a list of ordered\ntypes, see <a href=\"https://pkg.go.dev/cmp#Ordered\">cmp.Ordered</a>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">strs</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;c&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;a&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;b&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">Sort</span><span class=\"p\">(</span><span class=\"nx\">strs</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Strings:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">strs</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>An example of sorting <code>int</code>s.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ints</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">Sort</span><span class=\"p\">(</span><span class=\"nx\">ints</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Ints:   &#34;</span><span class=\"p\">,</span> <span class=\"nx\">ints</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can also use the <code>slices</code> package to check if\na slice is already in sorted order.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"o\">:=</span> <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">IsSorted</span><span class=\"p\">(</span><span class=\"nx\">ints</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Sorted: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run sorting.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Strings: [a b c]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Ints:    [2 4 7]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Sorted:  true</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"sorting-by-functions\" rel=\"next\">Sorting by Functions</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"slices\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    strs :\\u003D []string{\\\"c\\\", \\\"a\\\", \\\"b\\\"}\\u000A    slices.Sort(strs)\\u000A    fmt.Println(\\\"Strings:\\\", strs)\\u000A');codeLines.push('    ints :\\u003D []int{7, 2, 4}\\u000A    slices.Sort(ints)\\u000A    fmt.Println(\\\"Ints:   \\\", ints)\\u000A');codeLines.push('    s :\\u003D slices.IsSorted(ints)\\u000A    fmt.Println(\\\"Sorted: \\\", s)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/sorting-by-functions",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Sorting by Functions</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'sorting';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'panic';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"sorting-by-functions\">\n      <h2><a href=\"./\">Go by Example</a>: Sorting by Functions</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sometimes we&rsquo;ll want to sort a collection by something\nother than its natural order. For example, suppose we\nwanted to sort strings by their length instead of\nalphabetically. Here&rsquo;s an example of custom sorts\nin Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/3EaTknAZHMu\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;cmp&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;slices&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fruits</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;peach&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;banana&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;kiwi&#34;</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We implement a comparison function for string\nlengths. <code>cmp.Compare</code> is helpful for this.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lenCmp</span> <span class=\"o\">:=</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">cmp</span><span class=\"p\">.</span><span class=\"nf\">Compare</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">),</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">b</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now we can call <code>slices.SortFunc</code> with this custom\ncomparison function to sort <code>fruits</code> by name length.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">SortFunc</span><span class=\"p\">(</span><span class=\"nx\">fruits</span><span class=\"p\">,</span> <span class=\"nx\">lenCmp</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">fruits</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can use the same technique to sort a slice of\nvalues that aren&rsquo;t built-in types.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">type</span> <span class=\"nx\">Person</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">name</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">age</span>  <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">people</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"nx\">Person</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Jax&#34;</span><span class=\"p\">,</span> <span class=\"nx\">age</span><span class=\"p\">:</span> <span class=\"mi\">37</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;TJ&#34;</span><span class=\"p\">,</span> <span class=\"nx\">age</span><span class=\"p\">:</span> <span class=\"mi\">25</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Alex&#34;</span><span class=\"p\">,</span> <span class=\"nx\">age</span><span class=\"p\">:</span> <span class=\"mi\">72</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sort <code>people</code> by age using <code>slices.SortFunc</code>.</p>\n\n<p>Note: if the <code>Person</code> struct is large,\nyou may want the slice to contain <code>*Person</code> instead\nand adjust the sorting function accordingly. If in\ndoubt, <a href=\"testing-and-benchmarking\">benchmark</a>!</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">slices</span><span class=\"p\">.</span><span class=\"nf\">SortFunc</span><span class=\"p\">(</span><span class=\"nx\">people</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"nx\">Person</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">return</span> <span class=\"nx\">cmp</span><span class=\"p\">.</span><span class=\"nf\">Compare</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nx\">age</span><span class=\"p\">,</span> <span class=\"nx\">b</span><span class=\"p\">.</span><span class=\"nx\">age</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">})</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">people</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run sorting-by-functions.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[kiwi peach banana]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[{TJ 25} {Jax 37} {Alex 72}]</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"panic\" rel=\"next\">Panic</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"cmp\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"slices\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A    fruits :\\u003D []string{\\\"peach\\\", \\\"banana\\\", \\\"kiwi\\\"}\\u000A');codeLines.push('    lenCmp :\\u003D func(a, b string) int {\\u000A        return cmp.Compare(len(a), len(b))\\u000A    }\\u000A');codeLines.push('    slices.SortFunc(fruits, lenCmp)\\u000A    fmt.Println(fruits)\\u000A');codeLines.push('    type Person struct {\\u000A        name string\\u000A        age  int\\u000A    }\\u000A');codeLines.push('    people :\\u003D []Person{\\u000A        Person{name: \\\"Jax\\\", age: 37},\\u000A        Person{name: \\\"TJ\\\", age: 25},\\u000A        Person{name: \\\"Alex\\\", age: 72},\\u000A    }\\u000A');codeLines.push('    slices.SortFunc(people,\\u000A        func(a, b Person) int {\\u000A            return cmp.Compare(a.age, b.age)\\u000A        })\\u000A    fmt.Println(people)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/spawning-processes",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Spawning Processes</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'context';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'execing-processes';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"spawning-processes\">\n      <h2><a href=\"./\">Go by Example</a>: Spawning Processes</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sometimes our Go programs need to spawn other\nprocesses.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/IxGAEXe0I7U\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;errors&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;io&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os/exec&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll start with a simple command that takes no\narguments or input and just prints something to\nstdout. The <code>exec.Command</code> helper creates an object\nto represent this external process.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dateCmd</span> <span class=\"o\">:=</span> <span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nf\">Command</span><span class=\"p\">(</span><span class=\"s\">&#34;date&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>Output</code> method runs the command, waits for it\nto finish and collects its standard output.\n If there were no errors, <code>dateOut</code> will hold bytes\nwith the date info.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dateOut</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">dateCmd</span><span class=\"p\">.</span><span class=\"nf\">Output</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;&gt; date&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">dateOut</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Output</code> and other methods of <code>Command</code> will return\n<code>*exec.Error</code> if there was a problem executing the\ncommand (e.g. wrong path), and <code>*exec.ExitError</code>\nif the command ran but exited with a non-zero return\ncode.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nf\">Command</span><span class=\"p\">(</span><span class=\"s\">&#34;date&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-x&#34;</span><span class=\"p\">).</span><span class=\"nf\">Output</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">e</span><span class=\"p\">,</span> <span class=\"nx\">ok</span> <span class=\"o\">:=</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nx\">AsType</span><span class=\"p\">[</span><span class=\"o\">*</span><span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nx\">Error</span><span class=\"p\">](</span><span class=\"nx\">err</span><span class=\"p\">);</span> <span class=\"nx\">ok</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;failed executing:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"k\">if</span> <span class=\"nx\">e</span><span class=\"p\">,</span> <span class=\"nx\">ok</span> <span class=\"o\">:=</span> <span class=\"nx\">errors</span><span class=\"p\">.</span><span class=\"nx\">AsType</span><span class=\"p\">[</span><span class=\"o\">*</span><span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nx\">ExitError</span><span class=\"p\">](</span><span class=\"nx\">err</span><span class=\"p\">);</span> <span class=\"nx\">ok</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">exitCode</span> <span class=\"o\">:=</span> <span class=\"nx\">e</span><span class=\"p\">.</span><span class=\"nf\">ExitCode</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;command exit rc =&#34;</span><span class=\"p\">,</span> <span class=\"nx\">exitCode</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at a slightly more involved case\nwhere we pipe data to the external process on its\n<code>stdin</code> and collect the results from its <code>stdout</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepCmd</span> <span class=\"o\">:=</span> <span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nf\">Command</span><span class=\"p\">(</span><span class=\"s\">&#34;grep&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;hello&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we explicitly grab input/output pipes, start\nthe process, write some input to it, read the\nresulting output, and finally wait for the process\nto exit.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepIn</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">grepCmd</span><span class=\"p\">.</span><span class=\"nf\">StdinPipe</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepOut</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">grepCmd</span><span class=\"p\">.</span><span class=\"nf\">StdoutPipe</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepCmd</span><span class=\"p\">.</span><span class=\"nf\">Start</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepIn</span><span class=\"p\">.</span><span class=\"nf\">Write</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"s\">&#34;hello grep\\ngoodbye grep&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepIn</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepBytes</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">io</span><span class=\"p\">.</span><span class=\"nf\">ReadAll</span><span class=\"p\">(</span><span class=\"nx\">grepOut</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">grepCmd</span><span class=\"p\">.</span><span class=\"nf\">Wait</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We omitted error checks in the above example, but\nyou could use the usual <code>if err != nil</code> pattern for\nall of them. We also only collect the <code>StdoutPipe</code>\nresults, but you could collect the <code>StderrPipe</code> in\nexactly the same way.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;&gt; grep hello&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">grepBytes</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that when spawning commands we need to\nprovide an explicitly delineated command and\nargument array, vs. being able to just pass in one\ncommand-line string. If you want to spawn a full\ncommand with a string, you can use <code>bash</code>&rsquo;s <code>-c</code>\noption:</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lsCmd</span> <span class=\"o\">:=</span> <span class=\"nx\">exec</span><span class=\"p\">.</span><span class=\"nf\">Command</span><span class=\"p\">(</span><span class=\"s\">&#34;bash&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-c&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;ls -a -l -h&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">lsOut</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">lsCmd</span><span class=\"p\">.</span><span class=\"nf\">Output</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;&gt; ls -a -l -h&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">lsOut</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The spawned programs return output that is the same\nas if we had run them directly from the command-line.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run spawning-processes.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"gp\">&gt;</span> date\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Thu 05 May 2022 10:10:12 PM PDT</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>date doesn&rsquo;t have a <code>-x</code> flag so it will exit with\nan error message and non-zero return code.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">command exit rc = 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"></span><span class=\"gp\">&gt;</span> grep hello\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello grep</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">&gt;</span> ls -a -l -h\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">drwxr-xr-x  4 mark 136B Oct 3 16:29 .\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">-rw-r--r--  1 mark 1.3K Oct 3 16:28 spawning-processes.go</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"execing-processes\" rel=\"next\">Exec'ing Processes</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"errors\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"io\\\"\\u000A    \\\"os/exec\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    dateCmd :\\u003D exec.Command(\\\"date\\\")\\u000A');codeLines.push('    dateOut, err :\\u003D dateCmd.Output()\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    fmt.Println(\\\"\\u003E date\\\")\\u000A    fmt.Println(string(dateOut))\\u000A');codeLines.push('    _, err \\u003D exec.Command(\\\"date\\\", \\\"-x\\\").Output()\\u000A    if err !\\u003D nil {\\u000A        if e, ok :\\u003D errors.AsType[*exec.Error](err); ok {\\u000A            fmt.Println(\\\"failed executing:\\\", e)\\u000A        } else if e, ok :\\u003D errors.AsType[*exec.ExitError](err); ok {\\u000A            exitCode :\\u003D e.ExitCode()\\u000A            fmt.Println(\\\"command exit rc \\u003D\\\", exitCode)\\u000A        } else {\\u000A            panic(err)\\u000A        }\\u000A    }\\u000A');codeLines.push('    grepCmd :\\u003D exec.Command(\\\"grep\\\", \\\"hello\\\")\\u000A');codeLines.push('    grepIn, _ :\\u003D grepCmd.StdinPipe()\\u000A    grepOut, _ :\\u003D grepCmd.StdoutPipe()\\u000A    grepCmd.Start()\\u000A    grepIn.Write([]byte(\\\"hello grep\\\\ngoodbye grep\\\"))\\u000A    grepIn.Close()\\u000A    grepBytes, _ :\\u003D io.ReadAll(grepOut)\\u000A    grepCmd.Wait()\\u000A');codeLines.push('    fmt.Println(\\\"\\u003E grep hello\\\")\\u000A    fmt.Println(string(grepBytes))\\u000A');codeLines.push('    lsCmd :\\u003D exec.Command(\\\"bash\\\", \\\"-c\\\", \\\"ls -a -l -h\\\")\\u000A    lsOut, err :\\u003D lsCmd.Output()\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    fmt.Println(\\\"\\u003E ls -a -l -h\\\")\\u000A    fmt.Println(string(lsOut))\\u000A}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/stateful-goroutines",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Stateful Goroutines</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'mutexes';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'sorting';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"stateful-goroutines\">\n      <h2><a href=\"./\">Go by Example</a>: Stateful Goroutines</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In the previous example we used explicit locking with\n<a href=\"mutexes\">mutexes</a> to synchronize access to shared state\nacross multiple goroutines. Another option is to use the\nbuilt-in synchronization features of  goroutines and\nchannels to achieve the same result. This channel-based\napproach aligns with Go&rsquo;s ideas of sharing memory by\ncommunicating and having each piece of data owned\nby exactly one goroutine.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/uwnybdsnOSa\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;math/rand&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;sync/atomic&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In this example our state will be owned by a single\ngoroutine. This will guarantee that the data is never\ncorrupted with concurrent access. In order to read or\nwrite that state, other goroutines will send messages\nto the owning goroutine and receive corresponding\nreplies. These <code>readOp</code> and <code>writeOp</code> <code>struct</code>s\nencapsulate those requests and a way for the owning\ngoroutine to respond.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">readOp</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">key</span>  <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">resp</span> <span class=\"kd\">chan</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">writeOp</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">key</span>  <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">val</span>  <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">resp</span> <span class=\"kd\">chan</span> <span class=\"kt\">bool</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>As before we&rsquo;ll count how many operations we perform.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">readOps</span> <span class=\"kt\">uint64</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">writeOps</span> <span class=\"kt\">uint64</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>reads</code> and <code>writes</code> channels will be used by\nother goroutines to issue read and write requests,\nrespectively.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">reads</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"nx\">readOp</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">writes</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"nx\">writeOp</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here is the goroutine that owns the <code>state</code>, which\nis a map as in the previous example but now private\nto the stateful goroutine. This goroutine repeatedly\nselects on the <code>reads</code> and <code>writes</code> channels,\nresponding to requests as they arrive. A response\nis executed by first performing the requested\noperation and then sending a value on the response\nchannel <code>resp</code> to indicate success (and the desired\nvalue in the case of <code>reads</code>).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"kd\">var</span> <span class=\"nx\">state</span> <span class=\"p\">=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">int</span><span class=\"p\">]</span><span class=\"kt\">int</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">case</span> <span class=\"nx\">read</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">reads</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">read</span><span class=\"p\">.</span><span class=\"nx\">resp</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">state</span><span class=\"p\">[</span><span class=\"nx\">read</span><span class=\"p\">.</span><span class=\"nx\">key</span><span class=\"p\">]</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">case</span> <span class=\"nx\">write</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">writes</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">state</span><span class=\"p\">[</span><span class=\"nx\">write</span><span class=\"p\">.</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"p\">=</span> <span class=\"nx\">write</span><span class=\"p\">.</span><span class=\"nx\">val</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">write</span><span class=\"p\">.</span><span class=\"nx\">resp</span> <span class=\"o\">&lt;-</span> <span class=\"kc\">true</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This starts 100 goroutines to issue reads to the\nstate-owning goroutine via the <code>reads</code> channel.\nEach read requires constructing a <code>readOp</code>, sending\nit over the <code>reads</code> channel, and then receiving the\nresult over the provided <code>resp</code> channel.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"mi\">100</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">read</span> <span class=\"o\">:=</span> <span class=\"nx\">readOp</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                    <span class=\"nx\">key</span><span class=\"p\">:</span>  <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">Intn</span><span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">),</span>\n</span></span><span class=\"line\"><span class=\"cl\">                    <span class=\"nx\">resp</span><span class=\"p\">:</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">)}</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">reads</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">read</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"o\">&lt;-</span><span class=\"nx\">read</span><span class=\"p\">.</span><span class=\"nx\">resp</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">atomic</span><span class=\"p\">.</span><span class=\"nf\">AddUint64</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">readOps</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Millisecond</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We start 10 writes as well, using a similar\napproach.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"k\">range</span> <span class=\"mi\">10</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">write</span> <span class=\"o\">:=</span> <span class=\"nx\">writeOp</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                    <span class=\"nx\">key</span><span class=\"p\">:</span>  <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">Intn</span><span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">),</span>\n</span></span><span class=\"line\"><span class=\"cl\">                    <span class=\"nx\">val</span><span class=\"p\">:</span>  <span class=\"nx\">rand</span><span class=\"p\">.</span><span class=\"nf\">Intn</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">),</span>\n</span></span><span class=\"line\"><span class=\"cl\">                    <span class=\"nx\">resp</span><span class=\"p\">:</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">bool</span><span class=\"p\">)}</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">writes</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">write</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"o\">&lt;-</span><span class=\"nx\">write</span><span class=\"p\">.</span><span class=\"nx\">resp</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">atomic</span><span class=\"p\">.</span><span class=\"nf\">AddUint64</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">writeOps</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Millisecond</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Let the goroutines work for a second.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Finally, capture and report the op counts.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">readOpsFinal</span> <span class=\"o\">:=</span> <span class=\"nx\">atomic</span><span class=\"p\">.</span><span class=\"nf\">LoadUint64</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">readOps</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;readOps:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">readOpsFinal</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">writeOpsFinal</span> <span class=\"o\">:=</span> <span class=\"nx\">atomic</span><span class=\"p\">.</span><span class=\"nf\">LoadUint64</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">writeOps</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;writeOps:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">writeOpsFinal</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running our program shows that the goroutine-based\nstate management example completes about 80,000\ntotal operations.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run stateful-goroutines.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">readOps: 71708\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">writeOps: 7177</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For this particular case the goroutine-based approach\nwas a bit more involved than the mutex-based one. It\nmight be useful in certain cases though, for example\nwhere you have other channels involved or when managing\nmultiple such mutexes would be error-prone. You should\nuse whichever approach feels most natural, especially\nwith respect to understanding the correctness of your\nprogram.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"sorting\" rel=\"next\">Sorting</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"math/rand\\\"\\u000A    \\\"sync/atomic\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('type readOp struct {\\u000A    key  int\\u000A    resp chan int\\u000A}\\u000Atype writeOp struct {\\u000A    key  int\\u000A    val  int\\u000A    resp chan bool\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    var readOps uint64\\u000A    var writeOps uint64\\u000A');codeLines.push('    reads :\\u003D make(chan readOp)\\u000A    writes :\\u003D make(chan writeOp)\\u000A');codeLines.push('    go func() {\\u000A        var state \\u003D make(map[int]int)\\u000A        for {\\u000A            select {\\u000A            case read :\\u003D \\u003C-reads:\\u000A                read.resp \\u003C- state[read.key]\\u000A            case write :\\u003D \\u003C-writes:\\u000A                state[write.key] \\u003D write.val\\u000A                write.resp \\u003C- true\\u000A            }\\u000A        }\\u000A    }()\\u000A');codeLines.push('    for range 100 {\\u000A        go func() {\\u000A            for {\\u000A                read :\\u003D readOp{\\u000A                    key:  rand.Intn(5),\\u000A                    resp: make(chan int)}\\u000A                reads \\u003C- read\\u000A                \\u003C-read.resp\\u000A                atomic.AddUint64(\\u0026readOps, 1)\\u000A                time.Sleep(time.Millisecond)\\u000A            }\\u000A        }()\\u000A    }\\u000A');codeLines.push('    for range 10 {\\u000A        go func() {\\u000A            for {\\u000A                write :\\u003D writeOp{\\u000A                    key:  rand.Intn(5),\\u000A                    val:  rand.Intn(100),\\u000A                    resp: make(chan bool)}\\u000A                writes \\u003C- write\\u000A                \\u003C-write.resp\\u000A                atomic.AddUint64(\\u0026writeOps, 1)\\u000A                time.Sleep(time.Millisecond)\\u000A            }\\u000A        }()\\u000A    }\\u000A');codeLines.push('    time.Sleep(time.Second)\\u000A');codeLines.push('    readOpsFinal :\\u003D atomic.LoadUint64(\\u0026readOps)\\u000A    fmt.Println(\\\"readOps:\\\", readOpsFinal)\\u000A    writeOpsFinal :\\u003D atomic.LoadUint64(\\u0026writeOps)\\u000A    fmt.Println(\\\"writeOps:\\\", writeOpsFinal)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/string-formatting",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: String Formatting</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'string-functions';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'text-templates';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"string-formatting\">\n      <h2><a href=\"./\">Go by Example</a>: String Formatting</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers excellent support for string formatting in\nthe <code>printf</code> tradition. Here are some examples of\ncommon string formatting tasks.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/EZCZX1Uwp6D\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">point</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">x</span><span class=\"p\">,</span> <span class=\"nx\">y</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers several printing &ldquo;verbs&rdquo; designed to\nformat general Go values. For example, this prints\nan instance of our <code>point</code> struct.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span> <span class=\"o\">:=</span> <span class=\"nx\">point</span><span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;struct1: %v\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If the value is a struct, the <code>%+v</code> variant will\ninclude the struct&rsquo;s field names.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;struct2: %+v\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>%#v</code> variant prints a Go syntax representation\nof the value, i.e. the source code snippet that\nwould produce that value.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;struct3: %#v\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To print the type of a value, use <code>%T</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;type: %T\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Formatting booleans is straight-forward.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;bool: %t\\n&#34;</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>There are many options for formatting integers.\nUse <code>%d</code> for standard, base-10 formatting.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;int: %d\\n&#34;</span><span class=\"p\">,</span> <span class=\"mi\">123</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This prints a binary representation.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;bin: %b\\n&#34;</span><span class=\"p\">,</span> <span class=\"mi\">14</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This prints the character corresponding to the\ngiven integer.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;char: %c\\n&#34;</span><span class=\"p\">,</span> <span class=\"mi\">33</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>%x</code> provides hex encoding.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;hex: %x\\n&#34;</span><span class=\"p\">,</span> <span class=\"mi\">456</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>There are also several formatting options for\nfloats. For basic decimal formatting use <code>%f</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;float1: %f\\n&#34;</span><span class=\"p\">,</span> <span class=\"mf\">78.9</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>%e</code> and <code>%E</code> format the float in (slightly\ndifferent versions of) scientific notation.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;float2: %e\\n&#34;</span><span class=\"p\">,</span> <span class=\"mf\">123400000.0</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;float3: %E\\n&#34;</span><span class=\"p\">,</span> <span class=\"mf\">123400000.0</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For basic string printing use <code>%s</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;str1: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;\\&#34;string\\&#34;&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To double-quote strings as in Go source, use <code>%q</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;str2: %q\\n&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;\\&#34;string\\&#34;&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>As with integers seen earlier, <code>%x</code> renders\nthe string in base-16, with two output characters\nper byte of input.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;str3: %x\\n&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;hex this&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To print a representation of a pointer, use <code>%p</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;pointer: %p\\n&#34;</span><span class=\"p\">,</span> <span class=\"o\">&amp;</span><span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When formatting numbers you will often want to\ncontrol the width and precision of the resulting\nfigure. To specify the width of an integer, use a\nnumber after the <code>%</code> in the verb. By default the\nresult will be right-justified and padded with\nspaces.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;width1: |%6d|%6d|\\n&#34;</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">345</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also specify the width of printed floats,\nthough usually you&rsquo;ll also want to restrict the\ndecimal precision at the same time with the\nwidth.precision syntax.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;width2: |%6.2f|%6.2f|\\n&#34;</span><span class=\"p\">,</span> <span class=\"mf\">1.2</span><span class=\"p\">,</span> <span class=\"mf\">3.45</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To left-justify, use the <code>-</code> flag.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;width3: |%-6.2f|%-6.2f|\\n&#34;</span><span class=\"p\">,</span> <span class=\"mf\">1.2</span><span class=\"p\">,</span> <span class=\"mf\">3.45</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You may also want to control width when formatting\nstrings, especially to ensure that they align in\ntable-like output. For basic right-justified width.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;width4: |%6s|%6s|\\n&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;b&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To left-justify use the <code>-</code> flag as with numbers.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;width5: |%-6s|%-6s|\\n&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;b&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>So far we&rsquo;ve seen <code>Printf</code>, which prints the\nformatted string to <code>os.Stdout</code>. <code>Sprintf</code> formats\nand returns a string without printing it anywhere.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"o\">:=</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Sprintf</span><span class=\"p\">(</span><span class=\"s\">&#34;sprintf: a %s&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;string&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can format+print to <code>io.Writers</code> other than\n<code>os.Stdout</code> using <code>Fprintf</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Fprintf</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stderr</span><span class=\"p\">,</span> <span class=\"s\">&#34;io: an %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;error&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run string-formatting.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">struct1: {1 2}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">struct2: {x:1 y:2}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">struct3: main.point{x:1, y:2}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">type: main.point\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">bool: true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">int: 123\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">bin: 1110\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">char: !\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hex: 1c8\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">float1: 78.900000\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">float2: 1.234000e+08\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">float3: 1.234000E+08\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">str1: &#34;string&#34;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">str2: &#34;\\&#34;string\\&#34;&#34;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">str3: 6865782074686973\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">pointer: 0xc0000ba000\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">width1: |    12|   345|\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">width2: |  1.20|  3.45|\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">width3: |1.20  |3.45  |\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">width4: |   foo|     b|\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">width5: |foo   |b     |\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">sprintf: a string\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">io: an error</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"text-templates\" rel=\"next\">Text Templates</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A)\\u000A');codeLines.push('type point struct {\\u000A    x, y int\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    p :\\u003D point{1, 2}\\u000A    fmt.Printf(\\\"struct1: %v\\\\n\\\", p)\\u000A');codeLines.push('    fmt.Printf(\\\"struct2: %+v\\\\n\\\", p)\\u000A');codeLines.push('    fmt.Printf(\\\"struct3: %#v\\\\n\\\", p)\\u000A');codeLines.push('    fmt.Printf(\\\"type: %T\\\\n\\\", p)\\u000A');codeLines.push('    fmt.Printf(\\\"bool: %t\\\\n\\\", true)\\u000A');codeLines.push('    fmt.Printf(\\\"int: %d\\\\n\\\", 123)\\u000A');codeLines.push('    fmt.Printf(\\\"bin: %b\\\\n\\\", 14)\\u000A');codeLines.push('    fmt.Printf(\\\"char: %c\\\\n\\\", 33)\\u000A');codeLines.push('    fmt.Printf(\\\"hex: %x\\\\n\\\", 456)\\u000A');codeLines.push('    fmt.Printf(\\\"float1: %f\\\\n\\\", 78.9)\\u000A');codeLines.push('    fmt.Printf(\\\"float2: %e\\\\n\\\", 123400000.0)\\u000A    fmt.Printf(\\\"float3: %E\\\\n\\\", 123400000.0)\\u000A');codeLines.push('    fmt.Printf(\\\"str1: %s\\\\n\\\", \\\"\\\\\\\"string\\\\\\\"\\\")\\u000A');codeLines.push('    fmt.Printf(\\\"str2: %q\\\\n\\\", \\\"\\\\\\\"string\\\\\\\"\\\")\\u000A');codeLines.push('    fmt.Printf(\\\"str3: %x\\\\n\\\", \\\"hex this\\\")\\u000A');codeLines.push('    fmt.Printf(\\\"pointer: %p\\\\n\\\", \\u0026p)\\u000A');codeLines.push('    fmt.Printf(\\\"width1: |%6d|%6d|\\\\n\\\", 12, 345)\\u000A');codeLines.push('    fmt.Printf(\\\"width2: |%6.2f|%6.2f|\\\\n\\\", 1.2, 3.45)\\u000A');codeLines.push('    fmt.Printf(\\\"width3: |%-6.2f|%-6.2f|\\\\n\\\", 1.2, 3.45)\\u000A');codeLines.push('    fmt.Printf(\\\"width4: |%6s|%6s|\\\\n\\\", \\\"foo\\\", \\\"b\\\")\\u000A');codeLines.push('    fmt.Printf(\\\"width5: |%-6s|%-6s|\\\\n\\\", \\\"foo\\\", \\\"b\\\")\\u000A');codeLines.push('    s :\\u003D fmt.Sprintf(\\\"sprintf: a %s\\\", \\\"string\\\")\\u000A    fmt.Println(s)\\u000A');codeLines.push('    fmt.Fprintf(os.Stderr, \\\"io: an %s\\\\n\\\", \\\"error\\\")\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/string-functions",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: String Functions</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'recover';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'string-formatting';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"string-functions\">\n      <h2><a href=\"./\">Go by Example</a>: String Functions</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The standard library&rsquo;s <code>strings</code> package provides many\nuseful string-related functions. Here are some examples\nto give you a sense of the package.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/wKSAzxfs96O\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We alias <code>fmt.Println</code> to a shorter name as we&rsquo;ll use\nit a lot below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var</span> <span class=\"nx\">p</span> <span class=\"p\">=</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nx\">Println</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a sample of the functions available in\n<code>strings</code>. Since these are functions from the\npackage, not methods on the string object itself,\nwe need to pass the string in question as the first\nargument to the function. You can find more\nfunctions in the <a href=\"https://pkg.go.dev/strings\"><code>strings</code></a>\npackage docs.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Contains:  &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Contains</span><span class=\"p\">(</span><span class=\"s\">&#34;test&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;es&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Count:     &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Count</span><span class=\"p\">(</span><span class=\"s\">&#34;test&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;t&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;HasPrefix: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">HasPrefix</span><span class=\"p\">(</span><span class=\"s\">&#34;test&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;te&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;HasSuffix: &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">HasSuffix</span><span class=\"p\">(</span><span class=\"s\">&#34;test&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;st&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Index:     &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Index</span><span class=\"p\">(</span><span class=\"s\">&#34;test&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;e&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Join:      &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">([]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;a&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;b&#34;</span><span class=\"p\">},</span> <span class=\"s\">&#34;-&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Repeat:    &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Repeat</span><span class=\"p\">(</span><span class=\"s\">&#34;a&#34;</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Replace:   &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Replace</span><span class=\"p\">(</span><span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;o&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;0&#34;</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Replace:   &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Replace</span><span class=\"p\">(</span><span class=\"s\">&#34;foo&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;o&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;0&#34;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;Split:     &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">Split</span><span class=\"p\">(</span><span class=\"s\">&#34;a-b-c-d-e&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;-&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;ToLower:   &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">ToLower</span><span class=\"p\">(</span><span class=\"s\">&#34;TEST&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"s\">&#34;ToUpper:   &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nf\">ToUpper</span><span class=\"p\">(</span><span class=\"s\">&#34;test&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run string-functions.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Contains:   true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Count:      2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">HasPrefix:  true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">HasSuffix:  true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Index:      1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Join:       a-b\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Repeat:     aaaaa\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Replace:    f00\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Replace:    f0o\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Split:      [a b c d e]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ToLower:    test\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ToUpper:    TEST</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"string-formatting\" rel=\"next\">String Formatting</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    s \\\"strings\\\"\\u000A)\\u000A');codeLines.push('var p \\u003D fmt.Println\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    p(\\\"Contains:  \\\", s.Contains(\\\"test\\\", \\\"es\\\"))\\u000A    p(\\\"Count:     \\\", s.Count(\\\"test\\\", \\\"t\\\"))\\u000A    p(\\\"HasPrefix: \\\", s.HasPrefix(\\\"test\\\", \\\"te\\\"))\\u000A    p(\\\"HasSuffix: \\\", s.HasSuffix(\\\"test\\\", \\\"st\\\"))\\u000A    p(\\\"Index:     \\\", s.Index(\\\"test\\\", \\\"e\\\"))\\u000A    p(\\\"Join:      \\\", s.Join([]string{\\\"a\\\", \\\"b\\\"}, \\\"-\\\"))\\u000A    p(\\\"Repeat:    \\\", s.Repeat(\\\"a\\\", 5))\\u000A    p(\\\"Replace:   \\\", s.Replace(\\\"foo\\\", \\\"o\\\", \\\"0\\\", -1))\\u000A    p(\\\"Replace:   \\\", s.Replace(\\\"foo\\\", \\\"o\\\", \\\"0\\\", 1))\\u000A    p(\\\"Split:     \\\", s.Split(\\\"a-b-c-d-e\\\", \\\"-\\\"))\\u000A    p(\\\"ToLower:   \\\", s.ToLower(\\\"TEST\\\"))\\u000A    p(\\\"ToUpper:   \\\", s.ToUpper(\\\"test\\\"))\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/strings-and-runes",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Strings and Runes</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'pointers';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'structs';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"strings-and-runes\">\n      <h2><a href=\"./\">Go by Example</a>: Strings and Runes</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A Go string is a read-only slice of bytes. The language\nand the standard library treat strings specially - as\ncontainers of text encoded in <a href=\"https://en.wikipedia.org/wiki/UTF-8\">UTF-8</a>.\nIn other languages, strings are made of &ldquo;characters&rdquo;.\nIn Go, the concept of a character is called a <code>rune</code> - it&rsquo;s\nan integer that represents a Unicode code point.\n<a href=\"https://go.dev/blog/strings\">This Go blog post</a> is a good\nintroduction to the topic.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/-iNDXZ9IM3s\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;unicode/utf8&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>s</code> is a <code>string</code> assigned a literal value\nrepresenting the word &ldquo;hello&rdquo; in the Thai\nlanguage. Go string literals are UTF-8\nencoded text.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">const</span> <span class=\"nx\">s</span> <span class=\"p\">=</span> <span class=\"s\">&#34;สวัสดี&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Since strings are equivalent to <code>[]byte</code>, this\nwill produce the length of the raw bytes stored within.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Len:&#34;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Indexing into a string produces the raw byte values at\neach index. This loop generates the hex values of all\nthe bytes that constitute the code points in <code>s</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"p\">&lt;</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">);</span> <span class=\"nx\">i</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%x &#34;</span><span class=\"p\">,</span> <span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">])</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To count how many <em>runes</em> are in a string, we can use\nthe <code>utf8</code> package. Note that the run-time of\n<code>RuneCountInString</code> depends on the size of the string,\nbecause it has to decode each UTF-8 rune sequentially.\nSome Thai characters are represented by UTF-8 code points\nthat can span multiple bytes, so the result of this count\nmay be surprising.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Rune count:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">utf8</span><span class=\"p\">.</span><span class=\"nf\">RuneCountInString</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>range</code> loop handles strings specially and decodes\neach <code>rune</code> along with its offset in the string.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">idx</span><span class=\"p\">,</span> <span class=\"nx\">runeValue</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">s</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%#U starts at %d\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">runeValue</span><span class=\"p\">,</span> <span class=\"nx\">idx</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can achieve the same iteration by using the\n<code>utf8.DecodeRuneInString</code> function explicitly.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;\\nUsing DecodeRuneInString&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span><span class=\"p\">,</span> <span class=\"nx\">w</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"p\">&lt;</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">);</span> <span class=\"nx\">i</span> <span class=\"o\">+=</span> <span class=\"nx\">w</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">runeValue</span><span class=\"p\">,</span> <span class=\"nx\">width</span> <span class=\"o\">:=</span> <span class=\"nx\">utf8</span><span class=\"p\">.</span><span class=\"nf\">DecodeRuneInString</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">[</span><span class=\"nx\">i</span><span class=\"p\">:])</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%#U starts at %d\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">runeValue</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">w</span> <span class=\"p\">=</span> <span class=\"nx\">width</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This demonstrates passing a <code>rune</code> value to a function.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">examineRune</span><span class=\"p\">(</span><span class=\"nx\">runeValue</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">examineRune</span><span class=\"p\">(</span><span class=\"nx\">r</span> <span class=\"kt\">rune</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Values enclosed in single quotes are <em>rune literals</em>. We\ncan compare a <code>rune</code> value to a rune literal directly.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">r</span> <span class=\"o\">==</span> <span class=\"sc\">&#39;t&#39;</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;found tee&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"k\">if</span> <span class=\"nx\">r</span> <span class=\"o\">==</span> <span class=\"sc\">&#39;ส&#39;</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;found so sua&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run strings-and-runes.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Len: 18\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">e0 b8 aa e0 b8 a7 e0 b8 b1 e0 b8 aa e0 b8 94 e0 b8 b5 \n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Rune count: 6\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E2A &#39;ส&#39; starts at 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E27 &#39;ว&#39; starts at 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E31 &#39;ั&#39; starts at 6\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E2A &#39;ส&#39; starts at 9\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E14 &#39;ด&#39; starts at 12\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E35 &#39;ี&#39; starts at 15</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">Using DecodeRuneInString\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E2A &#39;ส&#39; starts at 0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">found so sua\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E27 &#39;ว&#39; starts at 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E31 &#39;ั&#39; starts at 6\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E2A &#39;ส&#39; starts at 9\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">found so sua\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E14 &#39;ด&#39; starts at 12\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">U+0E35 &#39;ี&#39; starts at 15</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"structs\" rel=\"next\">Structs</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"unicode/utf8\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    const s \\u003D \\\"สวัสดี\\\"\\u000A');codeLines.push('    fmt.Println(\\\"Len:\\\", len(s))\\u000A');codeLines.push('    for i :\\u003D 0; i \\u003C len(s); i++ {\\u000A        fmt.Printf(\\\"%x \\\", s[i])\\u000A    }\\u000A    fmt.Println()\\u000A');codeLines.push('    fmt.Println(\\\"Rune count:\\\", utf8.RuneCountInString(s))\\u000A');codeLines.push('    for idx, runeValue :\\u003D range s {\\u000A        fmt.Printf(\\\"%#U starts at %d\\\\n\\\", runeValue, idx)\\u000A    }\\u000A');codeLines.push('    fmt.Println(\\\"\\\\nUsing DecodeRuneInString\\\")\\u000A    for i, w :\\u003D 0, 0; i \\u003C len(s); i +\\u003D w {\\u000A        runeValue, width :\\u003D utf8.DecodeRuneInString(s[i:])\\u000A        fmt.Printf(\\\"%#U starts at %d\\\\n\\\", runeValue, i)\\u000A        w \\u003D width\\u000A');codeLines.push('        examineRune(runeValue)\\u000A    }\\u000A}\\u000A');codeLines.push('func examineRune(r rune) {\\u000A');codeLines.push('    if r \\u003D\\u003D \\'t\\' {\\u000A        fmt.Println(\\\"found tee\\\")\\u000A    } else if r \\u003D\\u003D \\'ส\\' {\\u000A        fmt.Println(\\\"found so sua\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/struct-embedding",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Struct Embedding</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'enums';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'generics';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"struct-embedding\">\n      <h2><a href=\"./\">Go by Example</a>: Struct Embedding</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports <em>embedding</em> of structs and interfaces\nto express a more seamless <em>composition</em> of types.\nThis is not to be confused with <a href=\"embed-directive\"><code>//go:embed</code></a> which is\na go directive introduced in Go version 1.16+ to embed\nfiles and folders into the application binary.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/-LOu1L0i2tR\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">base</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">num</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">b</span> <span class=\"nx\">base</span><span class=\"p\">)</span> <span class=\"nf\">describe</span><span class=\"p\">()</span> <span class=\"kt\">string</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Sprintf</span><span class=\"p\">(</span><span class=\"s\">&#34;base with num=%v&#34;</span><span class=\"p\">,</span> <span class=\"nx\">b</span><span class=\"p\">.</span><span class=\"nx\">num</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>container</code> <em>embeds</em> a <code>base</code>. An embedding looks\nlike a field without a name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">container</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">base</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">str</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When creating structs with literals, we have to\ninitialize the embedding explicitly; here the\nembedded type serves as the field name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">co</span> <span class=\"o\">:=</span> <span class=\"nx\">container</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">base</span><span class=\"p\">:</span> <span class=\"nx\">base</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">num</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">str</span><span class=\"p\">:</span> <span class=\"s\">&#34;some name&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can access the base&rsquo;s fields directly on <code>co</code>,\ne.g. <code>co.num</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;co={num: %v, str: %v}\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">co</span><span class=\"p\">.</span><span class=\"nx\">num</span><span class=\"p\">,</span> <span class=\"nx\">co</span><span class=\"p\">.</span><span class=\"nx\">str</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Alternatively, we can spell out the full path using\nthe embedded type name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;also num:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">co</span><span class=\"p\">.</span><span class=\"nx\">base</span><span class=\"p\">.</span><span class=\"nx\">num</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Since <code>container</code> embeds <code>base</code>, the methods of\n<code>base</code> also become methods of a <code>container</code>. Here\nwe invoke a method that was embedded from <code>base</code>\ndirectly on <code>co</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;describe:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">co</span><span class=\"p\">.</span><span class=\"nf\">describe</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">type</span> <span class=\"nx\">describer</span> <span class=\"kd\">interface</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">describe</span><span class=\"p\">()</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Embedding structs with methods may be used to bestow\ninterface implementations onto other structs. Here\nwe see that a <code>container</code> now implements the\n<code>describer</code> interface because it embeds <code>base</code>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">d</span> <span class=\"nx\">describer</span> <span class=\"p\">=</span> <span class=\"nx\">co</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;describer:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">d</span><span class=\"p\">.</span><span class=\"nf\">describe</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run struct-embedding.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">co={num: 1, str: some name}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">also num: 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">describe: base with num=1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">describer: base with num=1</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"generics\" rel=\"next\">Generics</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('type base struct {\\u000A    num int\\u000A}\\u000A');codeLines.push('func (b base) describe() string {\\u000A    return fmt.Sprintf(\\\"base with num\\u003D%v\\\", b.num)\\u000A}\\u000A');codeLines.push('type container struct {\\u000A    base\\u000A    str string\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    co :\\u003D container{\\u000A        base: base{\\u000A            num: 1,\\u000A        },\\u000A        str: \\\"some name\\\",\\u000A    }\\u000A');codeLines.push('    fmt.Printf(\\\"co\\u003D{num: %v, str: %v}\\\\n\\\", co.num, co.str)\\u000A');codeLines.push('    fmt.Println(\\\"also num:\\\", co.base.num)\\u000A');codeLines.push('    fmt.Println(\\\"describe:\\\", co.describe())\\u000A');codeLines.push('    type describer interface {\\u000A        describe() string\\u000A    }\\u000A');codeLines.push('    var d describer \\u003D co\\u000A    fmt.Println(\\\"describer:\\\", d.describe())\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/structs",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Structs</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'strings-and-runes';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'methods';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"structs\">\n      <h2><a href=\"./\">Go by Example</a>: Structs</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go&rsquo;s <em>structs</em> are typed collections of fields.\nThey&rsquo;re useful for grouping data together to form\nrecords.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/56SPo-L2nMN\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This <code>person</code> struct type has <code>name</code> and <code>age</code> fields.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">person</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">name</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">age</span>  <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>newPerson</code> constructs a new person struct with the given name.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">newPerson</span><span class=\"p\">(</span><span class=\"nx\">name</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"o\">*</span><span class=\"nx\">person</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go is a garbage collected language; you can safely\nreturn a pointer to a local variable - it will only\nbe cleaned up by the garbage collector when there\nare no active references to it.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span> <span class=\"o\">:=</span> <span class=\"nx\">person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"nx\">name</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span><span class=\"p\">.</span><span class=\"nx\">age</span> <span class=\"p\">=</span> <span class=\"mi\">42</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"o\">&amp;</span><span class=\"nx\">p</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This syntax creates a new struct.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">person</span><span class=\"p\">{</span><span class=\"s\">&#34;Bob&#34;</span><span class=\"p\">,</span> <span class=\"mi\">20</span><span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can name the fields when initializing a struct.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Alice&#34;</span><span class=\"p\">,</span> <span class=\"nx\">age</span><span class=\"p\">:</span> <span class=\"mi\">30</span><span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Omitted fields will be zero-valued.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Fred&#34;</span><span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>An <code>&amp;</code> prefix yields a pointer to the struct.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"o\">&amp;</span><span class=\"nx\">person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Ann&#34;</span><span class=\"p\">,</span> <span class=\"nx\">age</span><span class=\"p\">:</span> <span class=\"mi\">40</span><span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It&rsquo;s idiomatic to encapsulate new struct creation in constructor functions</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nf\">newPerson</span><span class=\"p\">(</span><span class=\"s\">&#34;Jon&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Access struct fields with a dot.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"o\">:=</span> <span class=\"nx\">person</span><span class=\"p\">{</span><span class=\"nx\">name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Sean&#34;</span><span class=\"p\">,</span> <span class=\"nx\">age</span><span class=\"p\">:</span> <span class=\"mi\">50</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">.</span><span class=\"nx\">name</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can also use dots with struct pointers - the\npointers are automatically dereferenced.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">sp</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">s</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">sp</span><span class=\"p\">.</span><span class=\"nx\">age</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Structs are mutable.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">sp</span><span class=\"p\">.</span><span class=\"nx\">age</span> <span class=\"p\">=</span> <span class=\"mi\">51</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">sp</span><span class=\"p\">.</span><span class=\"nx\">age</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If a struct type is only used for a single value, we don&rsquo;t\nhave to give it a name. The value can have an anonymous\nstruct type. This technique is commonly used for\n<a href=\"testing-and-benchmarking\">table-driven tests</a>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dog</span> <span class=\"o\">:=</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">name</span>   <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">isGood</span> <span class=\"kt\">bool</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;Rex&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"kc\">true</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">dog</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run structs.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{Bob 20}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{Alice 30}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{Fred 0}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">&amp;{Ann 40}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">&amp;{Jon 42}\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Sean\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">50\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">51\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">{Rex true}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"methods\" rel=\"next\">Methods</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('type person struct {\\u000A    name string\\u000A    age  int\\u000A}\\u000A');codeLines.push('func newPerson(name string) *person {\\u000A');codeLines.push('    p :\\u003D person{name: name}\\u000A    p.age \\u003D 42\\u000A    return \\u0026p\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    fmt.Println(person{\\\"Bob\\\", 20})\\u000A');codeLines.push('    fmt.Println(person{name: \\\"Alice\\\", age: 30})\\u000A');codeLines.push('    fmt.Println(person{name: \\\"Fred\\\"})\\u000A');codeLines.push('    fmt.Println(\\u0026person{name: \\\"Ann\\\", age: 40})\\u000A');codeLines.push('    fmt.Println(newPerson(\\\"Jon\\\"))\\u000A');codeLines.push('    s :\\u003D person{name: \\\"Sean\\\", age: 50}\\u000A    fmt.Println(s.name)\\u000A');codeLines.push('    sp :\\u003D \\u0026s\\u000A    fmt.Println(sp.age)\\u000A');codeLines.push('    sp.age \\u003D 51\\u000A    fmt.Println(sp.age)\\u000A');codeLines.push('    dog :\\u003D struct {\\u000A        name   string\\u000A        isGood bool\\u000A    }{\\u000A        \\\"Rex\\\",\\u000A        true,\\u000A    }\\u000A    fmt.Println(dog)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/switch",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Switch</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'if-else';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'arrays';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"switch\">\n      <h2><a href=\"./\">Go by Example</a>: Switch</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Switch statements</em> express conditionals across many\nbranches.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/qVDqWoUQ6AI\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a basic <code>switch</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">2</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"s\">&#34;Write &#34;</span><span class=\"p\">,</span> <span class=\"nx\">i</span><span class=\"p\">,</span> <span class=\"s\">&#34; as &#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">switch</span> <span class=\"nx\">i</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;one&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;two&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"mi\">3</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;three&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can use commas to separate multiple expressions\nin the same <code>case</code> statement. We use the optional\n<code>default</code> case in this example as well.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">switch</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">().</span><span class=\"nf\">Weekday</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Saturday</span><span class=\"p\">,</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Sunday</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;It&#39;s the weekend&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;It&#39;s a weekday&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>switch</code> without an expression is an alternate way\nto express if/else logic. Here we also show how the\n<code>case</code> expressions can be non-constants.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">switch</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Hour</span><span class=\"p\">()</span> <span class=\"p\">&lt;</span> <span class=\"mi\">12</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;It&#39;s before noon&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;It&#39;s after noon&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A type <code>switch</code> compares types instead of values.  You\ncan use this to discover the type of an interface\nvalue.  In this example, the variable <code>t</code> will have the\ntype corresponding to its clause.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">whatAmI</span> <span class=\"o\">:=</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">i</span> <span class=\"kd\">interface</span><span class=\"p\">{})</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">switch</span> <span class=\"nx\">t</span> <span class=\"o\">:=</span> <span class=\"nx\">i</span><span class=\"p\">.(</span><span class=\"kd\">type</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">case</span> <span class=\"kt\">bool</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;I&#39;m a bool&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">case</span> <span class=\"kt\">int</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;I&#39;m an int&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">default</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;Don&#39;t know type %T\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">t</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">whatAmI</span><span class=\"p\">(</span><span class=\"kc\">true</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">whatAmI</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">whatAmI</span><span class=\"p\">(</span><span class=\"s\">&#34;hey&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run switch.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Write 2 as two\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">It&#39;s a weekday\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">It&#39;s after noon\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">I&#39;m a bool\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">I&#39;m an int\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Don&#39;t know type string</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"arrays\" rel=\"next\">Arrays</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    i :\\u003D 2\\u000A    fmt.Print(\\\"Write \\\", i, \\\" as \\\")\\u000A    switch i {\\u000A    case 1:\\u000A        fmt.Println(\\\"one\\\")\\u000A    case 2:\\u000A        fmt.Println(\\\"two\\\")\\u000A    case 3:\\u000A        fmt.Println(\\\"three\\\")\\u000A    }\\u000A');codeLines.push('    switch time.Now().Weekday() {\\u000A    case time.Saturday, time.Sunday:\\u000A        fmt.Println(\\\"It\\'s the weekend\\\")\\u000A    default:\\u000A        fmt.Println(\\\"It\\'s a weekday\\\")\\u000A    }\\u000A');codeLines.push('    t :\\u003D time.Now()\\u000A    switch {\\u000A    case t.Hour() \\u003C 12:\\u000A        fmt.Println(\\\"It\\'s before noon\\\")\\u000A    default:\\u000A        fmt.Println(\\\"It\\'s after noon\\\")\\u000A    }\\u000A');codeLines.push('    whatAmI :\\u003D func(i interface{}) {\\u000A        switch t :\\u003D i.(type) {\\u000A        case bool:\\u000A            fmt.Println(\\\"I\\'m a bool\\\")\\u000A        case int:\\u000A            fmt.Println(\\\"I\\'m an int\\\")\\u000A        default:\\u000A            fmt.Printf(\\\"Don\\'t know type %T\\\\n\\\", t)\\u000A        }\\u000A    }\\u000A    whatAmI(true)\\u000A    whatAmI(1)\\u000A    whatAmI(\\\"hey\\\")\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/tcp-server",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: TCP Server</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'http-server';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'context';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"tcp-server\">\n      <h2><a href=\"./\">Go by Example</a>: TCP Server</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>net</code> package provides the tools we need to easily build\nTCP socket servers.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/G0k2jHMA6ei\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bufio&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;log&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;net&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;strings&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>net.Listen</code> starts the server on the given network\n(TCP) and address (port 8090 on all interfaces).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">listener</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">net</span><span class=\"p\">.</span><span class=\"nf\">Listen</span><span class=\"p\">(</span><span class=\"s\">&#34;tcp&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;:8090&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Fatal</span><span class=\"p\">(</span><span class=\"s\">&#34;Error listening:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Close the listener to free the port\nwhen the application exits.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">listener</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Loop indefinitely to accept new client connections.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Wait for a connection.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">conn</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">listener</span><span class=\"p\">.</span><span class=\"nf\">Accept</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Error accepting conn:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">continue</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We use a goroutine here to handle the connection\nso that the main loop can continue accepting more\nconnections.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"k\">go</span> <span class=\"nf\">handleConnection</span><span class=\"p\">(</span><span class=\"nx\">conn</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>handleConnection</code> handles a single client connection,\nreading one line of text from the client and returning a response.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">handleConnection</span><span class=\"p\">(</span><span class=\"nx\">conn</span> <span class=\"nx\">net</span><span class=\"p\">.</span><span class=\"nx\">Conn</span><span class=\"p\">)</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Closing the connection releases resources when\nwe are finished interacting with the client.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">conn</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>bufio.NewReader</code> to read one line of data\nfrom the client (terminated by a newline).</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">reader</span> <span class=\"o\">:=</span> <span class=\"nx\">bufio</span><span class=\"p\">.</span><span class=\"nf\">NewReader</span><span class=\"p\">(</span><span class=\"nx\">conn</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">message</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">reader</span><span class=\"p\">.</span><span class=\"nf\">ReadString</span><span class=\"p\">(</span><span class=\"sc\">&#39;\\n&#39;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;Read error: %v&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Create and send a response back to the client,\ndemonstrating two-way communication.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ackMsg</span> <span class=\"o\">:=</span> <span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">ToUpper</span><span class=\"p\">(</span><span class=\"nx\">strings</span><span class=\"p\">.</span><span class=\"nf\">TrimSpace</span><span class=\"p\">(</span><span class=\"nx\">message</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">response</span> <span class=\"o\">:=</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Sprintf</span><span class=\"p\">(</span><span class=\"s\">&#34;ACK: %s\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">ackMsg</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">conn</span><span class=\"p\">.</span><span class=\"nf\">Write</span><span class=\"p\">([]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"nx\">response</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">log</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;Server write error: %v&#34;</span><span class=\"p\">,</span> <span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Run the TCP server in the background.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run tcp-server.go &amp;</span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Send data and capture the response using netcat.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> echo &#34;Hello from netcat&#34; | nc localhost 8090\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ACK: HELLO FROM NETCAT</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"context\" rel=\"next\">Context</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bufio\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"log\\\"\\u000A    \\\"net\\\"\\u000A    \\\"strings\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    listener, err :\\u003D net.Listen(\\\"tcp\\\", \\\":8090\\\")\\u000A    if err !\\u003D nil {\\u000A        log.Fatal(\\\"Error listening:\\\", err)\\u000A    }\\u000A');codeLines.push('    defer listener.Close()\\u000A');codeLines.push('    for {\\u000A');codeLines.push('        conn, err :\\u003D listener.Accept()\\u000A        if err !\\u003D nil {\\u000A            log.Println(\\\"Error accepting conn:\\\", err)\\u000A            continue\\u000A        }\\u000A');codeLines.push('        go handleConnection(conn)\\u000A    }\\u000A}\\u000A');codeLines.push('func handleConnection(conn net.Conn) {\\u000A');codeLines.push('    defer conn.Close()\\u000A');codeLines.push('    reader :\\u003D bufio.NewReader(conn)\\u000A    message, err :\\u003D reader.ReadString(\\'\\\\n\\')\\u000A    if err !\\u003D nil {\\u000A        log.Printf(\\\"Read error: %v\\\", err)\\u000A        return\\u000A    }\\u000A');codeLines.push('    ackMsg :\\u003D strings.ToUpper(strings.TrimSpace(message))\\u000A    response :\\u003D fmt.Sprintf(\\\"ACK: %s\\\\n\\\", ackMsg)\\u000A    _, err \\u003D conn.Write([]byte(response))\\u000A    if err !\\u003D nil {\\u000A        log.Printf(\\\"Server write error: %v\\\", err)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/temporary-files-and-directories",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Temporary Files and Directories</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'directories';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'embed-directive';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"temporary-files-and-directories\">\n      <h2><a href=\"./\">Go by Example</a>: Temporary Files and Directories</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Throughout program execution, we often want to create\ndata that isn&rsquo;t needed after the program exits.\n<em>Temporary files and directories</em> are useful for this\npurpose since they don&rsquo;t pollute the file system over\ntime.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/hVcPg9RH3_V\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">e</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The easiest way to create a temporary file is by\ncalling <code>os.CreateTemp</code>. It creates a file <em>and</em>\nopens it for reading and writing. We provide <code>&quot;&quot;</code>\nas the first argument, so <code>os.CreateTemp</code> will\ncreate the file in the default location for our OS.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">CreateTemp</span><span class=\"p\">(</span><span class=\"s\">&#34;&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;sample&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Display the name of the temporary file. On\nUnix-based OSes the directory will likely be <code>/tmp</code>.\nThe file name starts with the prefix given as the\nsecond argument to <code>os.CreateTemp</code> and the rest\nis chosen automatically to ensure that concurrent\ncalls will always create different file names.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Temp file name:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Name</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Clean up the file after we&rsquo;re done. The OS is\nlikely to clean up temporary files by itself after\nsome time, but it&rsquo;s good practice to do this\nexplicitly.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Remove</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Name</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can write some data to the file.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Write</span><span class=\"p\">([]</span><span class=\"kt\">byte</span><span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">})</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If we intend to write many temporary files, we may\nprefer to create a temporary <em>directory</em>.\n<code>os.MkdirTemp</code>&rsquo;s arguments are the same as\n<code>CreateTemp</code>&rsquo;s, but it returns a directory <em>name</em>\nrather than an open file.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">dname</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">MkdirTemp</span><span class=\"p\">(</span><span class=\"s\">&#34;&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;sampledir&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Temp dir name:&#34;</span><span class=\"p\">,</span> <span class=\"nx\">dname</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">RemoveAll</span><span class=\"p\">(</span><span class=\"nx\">dname</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Now we can synthesize temporary file names by\nprefixing them with our temporary directory.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fname</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"nx\">dname</span><span class=\"p\">,</span> <span class=\"s\">&#34;file1&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"p\">=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">WriteFile</span><span class=\"p\">(</span><span class=\"nx\">fname</span><span class=\"p\">,</span> <span class=\"p\">[]</span><span class=\"kt\">byte</span><span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">},</span> <span class=\"mo\">0666</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run temporary-files-and-directories.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Temp file name: /tmp/sample610887201\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Temp dir name: /tmp/sampledir898854668</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"embed-directive\" rel=\"next\">Embed Directive</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A    \\\"path/filepath\\\"\\u000A)\\u000A');codeLines.push('func check(e error) {\\u000A    if e !\\u003D nil {\\u000A        panic(e)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    f, err :\\u003D os.CreateTemp(\\\"\\\", \\\"sample\\\")\\u000A    check(err)\\u000A');codeLines.push('    fmt.Println(\\\"Temp file name:\\\", f.Name())\\u000A');codeLines.push('    defer os.Remove(f.Name())\\u000A');codeLines.push('    _, err \\u003D f.Write([]byte{1, 2, 3, 4})\\u000A    check(err)\\u000A');codeLines.push('    dname, err :\\u003D os.MkdirTemp(\\\"\\\", \\\"sampledir\\\")\\u000A    check(err)\\u000A    fmt.Println(\\\"Temp dir name:\\\", dname)\\u000A');codeLines.push('    defer os.RemoveAll(dname)\\u000A');codeLines.push('    fname :\\u003D filepath.Join(dname, \\\"file1\\\")\\u000A    err \\u003D os.WriteFile(fname, []byte{1, 2}, 0666)\\u000A    check(err)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/testing-and-benchmarking",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Testing and Benchmarking</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'embed-directive';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'command-line-arguments';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"testing-and-benchmarking\">\n      <h2><a href=\"./\">Go by Example</a>: Testing and Benchmarking</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Unit testing is an important part of writing\nprincipled Go programs. The <code>testing</code> package\nprovides the tools we need to write unit tests\nand the <code>go test</code> command runs tests.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For the sake of demonstration, this code is in package\n<code>main</code>, but it could be any package. Testing code\ntypically lives in the same package as the code it tests.</p>\n\n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/osZckbKSkse\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;testing&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll be testing this simple implementation of an\ninteger minimum. Typically, the code we&rsquo;re testing\nwould be in a source file named something like\n<code>intutils.go</code>, and the test file for it would then\nbe named <code>intutils_test.go</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">IntMin</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"kt\">int</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">a</span> <span class=\"p\">&lt;</span> <span class=\"nx\">b</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">a</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">b</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A test is created by writing a function with a name\nbeginning with <code>Test</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">TestIntMinBasic</span><span class=\"p\">(</span><span class=\"nx\">t</span> <span class=\"o\">*</span><span class=\"nx\">testing</span><span class=\"p\">.</span><span class=\"nx\">T</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ans</span> <span class=\"o\">:=</span> <span class=\"nf\">IntMin</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">ans</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">2</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>t.Error*</code> will report test failures but continue\nexecuting the test. <code>t.Fatal*</code> will report test\nfailures and stop the test immediately.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Errorf</span><span class=\"p\">(</span><span class=\"s\">&#34;IntMin(2, -2) = %d; want -2&#34;</span><span class=\"p\">,</span> <span class=\"nx\">ans</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Writing tests can be repetitive, so it&rsquo;s idiomatic to\nuse a <em>table-driven style</em>, where test inputs and\nexpected outputs are listed in a table and a single loop\nwalks over them and performs the test logic.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">TestIntMinTableDriven</span><span class=\"p\">(</span><span class=\"nx\">t</span> <span class=\"o\">*</span><span class=\"nx\">testing</span><span class=\"p\">.</span><span class=\"nx\">T</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">tests</span> <span class=\"p\">=</span> <span class=\"p\">[]</span><span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">b</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">want</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">{</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">},</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>t.Run</code> enables running &ldquo;subtests&rdquo;, one for each\ntable entry. These are shown separately\nwhen executing <code>go test -v</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">tt</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">tests</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">testname</span> <span class=\"o\">:=</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Sprintf</span><span class=\"p\">(</span><span class=\"s\">&#34;%d,%d&#34;</span><span class=\"p\">,</span> <span class=\"nx\">tt</span><span class=\"p\">.</span><span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">tt</span><span class=\"p\">.</span><span class=\"nx\">b</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Run</span><span class=\"p\">(</span><span class=\"nx\">testname</span><span class=\"p\">,</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">t</span> <span class=\"o\">*</span><span class=\"nx\">testing</span><span class=\"p\">.</span><span class=\"nx\">T</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nx\">ans</span> <span class=\"o\">:=</span> <span class=\"nf\">IntMin</span><span class=\"p\">(</span><span class=\"nx\">tt</span><span class=\"p\">.</span><span class=\"nx\">a</span><span class=\"p\">,</span> <span class=\"nx\">tt</span><span class=\"p\">.</span><span class=\"nx\">b</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">if</span> <span class=\"nx\">ans</span> <span class=\"o\">!=</span> <span class=\"nx\">tt</span><span class=\"p\">.</span><span class=\"nx\">want</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Errorf</span><span class=\"p\">(</span><span class=\"s\">&#34;got %d, want %d&#34;</span><span class=\"p\">,</span> <span class=\"nx\">ans</span><span class=\"p\">,</span> <span class=\"nx\">tt</span><span class=\"p\">.</span><span class=\"nx\">want</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">})</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Benchmark tests typically go in <code>_test.go</code> files and are\nnamed beginning with <code>Benchmark</code>.\nAny code that&rsquo;s required for the benchmark to run but should\nnot be measured goes before this loop.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">BenchmarkIntMin</span><span class=\"p\">(</span><span class=\"nx\">b</span> <span class=\"o\">*</span><span class=\"nx\">testing</span><span class=\"p\">.</span><span class=\"nx\">B</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">b</span><span class=\"p\">.</span><span class=\"nf\">Loop</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The benchmark runner will automatically execute this loop\nbody many times to determine a reasonable estimate of the\nrun-time of a single iteration.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">        <span class=\"nf\">IntMin</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Run all tests in the current project in verbose mode.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go test -v\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">== RUN   TestIntMinBasic\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">--- PASS: TestIntMinBasic (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">=== RUN   TestIntMinTableDriven\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">=== RUN   TestIntMinTableDriven/0,1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">=== RUN   TestIntMinTableDriven/1,0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">=== RUN   TestIntMinTableDriven/2,-2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">=== RUN   TestIntMinTableDriven/0,-1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">=== RUN   TestIntMinTableDriven/-1,0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">--- PASS: TestIntMinTableDriven (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    --- PASS: TestIntMinTableDriven/0,1 (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    --- PASS: TestIntMinTableDriven/1,0 (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    --- PASS: TestIntMinTableDriven/2,-2 (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    --- PASS: TestIntMinTableDriven/0,-1 (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">    --- PASS: TestIntMinTableDriven/-1,0 (0.00s)\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">PASS\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ok      examples/testing-and-benchmarking    0.023s</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Run all benchmarks in the current project. All tests\nare run prior to benchmarks. The <code>bench</code> flag filters\nbenchmark function names with a regexp.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go test -bench=.\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">goos: darwin\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">goarch: arm64\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">pkg: examples/testing\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">BenchmarkIntMin-8 1000000000 0.3136 ns/op\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">PASS\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">ok      examples/testing-and-benchmarking    0.351s</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"command-line-arguments\" rel=\"next\">Command-Line Arguments</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"testing\\\"\\u000A)\\u000A');codeLines.push('func IntMin(a, b int) int {\\u000A    if a \\u003C b {\\u000A        return a\\u000A    }\\u000A    return b\\u000A}\\u000A');codeLines.push('func TestIntMinBasic(t *testing.T) {\\u000A    ans :\\u003D IntMin(2, -2)\\u000A    if ans !\\u003D -2 {\\u000A');codeLines.push('        t.Errorf(\\\"IntMin(2, -2) \\u003D %d; want -2\\\", ans)\\u000A    }\\u000A}\\u000A');codeLines.push('func TestIntMinTableDriven(t *testing.T) {\\u000A    var tests \\u003D []struct {\\u000A        a, b int\\u000A        want int\\u000A    }{\\u000A        {0, 1, 0},\\u000A        {1, 0, 0},\\u000A        {2, -2, -2},\\u000A        {0, -1, -1},\\u000A        {-1, 0, -1},\\u000A    }\\u000A');codeLines.push('    for _, tt :\\u003D range tests {\\u000A');codeLines.push('        testname :\\u003D fmt.Sprintf(\\\"%d,%d\\\", tt.a, tt.b)\\u000A        t.Run(testname, func(t *testing.T) {\\u000A            ans :\\u003D IntMin(tt.a, tt.b)\\u000A            if ans !\\u003D tt.want {\\u000A                t.Errorf(\\\"got %d, want %d\\\", ans, tt.want)\\u000A            }\\u000A        })\\u000A    }\\u000A}\\u000A');codeLines.push('func BenchmarkIntMin(b *testing.B) {\\u000A    for b.Loop() {\\u000A');codeLines.push('        IntMin(1, 2)\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/text-templates",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Text Templates</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'string-formatting';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'regular-expressions';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"text-templates\">\n      <h2><a href=\"./\">Go by Example</a>: Text Templates</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers built-in support for creating dynamic content or showing customized\noutput to the user with the <code>text/template</code> package. A sibling package\nnamed <code>html/template</code> provides the same API but has additional security\nfeatures and should be used for generating HTML.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/pDwkw1iMACF\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;text/template&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can create a new template and parse its body from\na string.\nTemplates are a mix of static text and &ldquo;actions&rdquo; enclosed in\n<code>{{...}}</code> that are used to dynamically insert content.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span> <span class=\"o\">:=</span> <span class=\"nx\">template</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"s\">&#34;t1&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">t1</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"s\">&#34;Value is {{.}}\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Alternatively, we can use the <code>template.Must</code> function to\npanic in case <code>Parse</code> returns an error. This is especially\nuseful for templates initialized in the global scope.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span> <span class=\"p\">=</span> <span class=\"nx\">template</span><span class=\"p\">.</span><span class=\"nf\">Must</span><span class=\"p\">(</span><span class=\"nx\">t1</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"s\">&#34;Value: {{.}}\\n&#34;</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>By &ldquo;executing&rdquo; the template we generate its text with\nspecific values for its actions. The <code>{{.}}</code> action is\nreplaced by the value passed as a parameter to <code>Execute</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"s\">&#34;some text&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;Go&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;Rust&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;C++&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;C#&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Helper function we&rsquo;ll use below.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Create</span> <span class=\"o\">:=</span> <span class=\"kd\">func</span><span class=\"p\">(</span><span class=\"nx\">name</span><span class=\"p\">,</span> <span class=\"nx\">t</span> <span class=\"kt\">string</span><span class=\"p\">)</span> <span class=\"o\">*</span><span class=\"nx\">template</span><span class=\"p\">.</span><span class=\"nx\">Template</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">return</span> <span class=\"nx\">template</span><span class=\"p\">.</span><span class=\"nf\">Must</span><span class=\"p\">(</span><span class=\"nx\">template</span><span class=\"p\">.</span><span class=\"nf\">New</span><span class=\"p\">(</span><span class=\"nx\">name</span><span class=\"p\">).</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"nx\">t</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If the data is a struct we can use the <code>{{.FieldName}}</code> action to access\nits fields. The fields should be exported to be accessible when a\ntemplate is executing.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t2</span> <span class=\"o\">:=</span> <span class=\"nf\">Create</span><span class=\"p\">(</span><span class=\"s\">&#34;t2&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;Name: {{.Name}}\\n&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t2</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Name</span> <span class=\"kt\">string</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}{</span><span class=\"s\">&#34;Jane Doe&#34;</span><span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The same applies to maps; with maps there is no restriction on the\ncase of key names.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t2</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"kd\">map</span><span class=\"p\">[</span><span class=\"kt\">string</span><span class=\"p\">]</span><span class=\"kt\">string</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;Name&#34;</span><span class=\"p\">:</span> <span class=\"s\">&#34;Mickey Mouse&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">})</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>if/else provide conditional execution for templates. A value is considered\nfalse if it&rsquo;s the default value of a type, such as 0, an empty string,\nnil pointer, etc.\nThis sample demonstrates another\nfeature of templates: using <code>-</code> in actions to trim whitespace.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t3</span> <span class=\"o\">:=</span> <span class=\"nf\">Create</span><span class=\"p\">(</span><span class=\"s\">&#34;t3&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;{{if . -}} yes {{else -}} no {{end}}\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t3</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"s\">&#34;not empty&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t3</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span> <span class=\"s\">&#34;&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>range blocks let us loop through slices, arrays, maps or channels. Inside\nthe range block <code>{{.}}</code> is set to the current item of the iteration.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t4</span> <span class=\"o\">:=</span> <span class=\"nf\">Create</span><span class=\"p\">(</span><span class=\"s\">&#34;t4&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"s\">&#34;Range: {{range .}}{{.}} {{end}}\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t4</span><span class=\"p\">.</span><span class=\"nf\">Execute</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nx\">Stdout</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"s\">&#34;Go&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"s\">&#34;Rust&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"s\">&#34;C++&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"s\">&#34;C#&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">})</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run templates.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Value: some text\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Value: 5\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Value: [Go Rust C++ C#]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Name: Jane Doe\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Name: Mickey Mouse\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">yes \n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">no \n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Range: Go Rust C++ C# </span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"regular-expressions\" rel=\"next\">Regular Expressions</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"os\\\"\\u000A    \\\"text/template\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    t1 :\\u003D template.New(\\\"t1\\\")\\u000A    t1, err :\\u003D t1.Parse(\\\"Value is {{.}}\\\\n\\\")\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A');codeLines.push('    t1 \\u003D template.Must(t1.Parse(\\\"Value: {{.}}\\\\n\\\"))\\u000A');codeLines.push('    t1.Execute(os.Stdout, \\\"some text\\\")\\u000A    t1.Execute(os.Stdout, 5)\\u000A    t1.Execute(os.Stdout, []string{\\u000A        \\\"Go\\\",\\u000A        \\\"Rust\\\",\\u000A        \\\"C++\\\",\\u000A        \\\"C#\\\",\\u000A    })\\u000A');codeLines.push('    Create :\\u003D func(name, t string) *template.Template {\\u000A        return template.Must(template.New(name).Parse(t))\\u000A    }\\u000A');codeLines.push('    t2 :\\u003D Create(\\\"t2\\\", \\\"Name: {{.Name}}\\\\n\\\")\\u000A');codeLines.push('    t2.Execute(os.Stdout, struct {\\u000A        Name string\\u000A    }{\\\"Jane Doe\\\"})\\u000A');codeLines.push('    t2.Execute(os.Stdout, map[string]string{\\u000A        \\\"Name\\\": \\\"Mickey Mouse\\\",\\u000A    })\\u000A');codeLines.push('    t3 :\\u003D Create(\\\"t3\\\",\\u000A        \\\"{{if . -}} yes {{else -}} no {{end}}\\\\n\\\")\\u000A    t3.Execute(os.Stdout, \\\"not empty\\\")\\u000A    t3.Execute(os.Stdout, \\\"\\\")\\u000A');codeLines.push('    t4 :\\u003D Create(\\\"t4\\\",\\u000A        \\\"Range: {{range .}}{{.}} {{end}}\\\\n\\\")\\u000A    t4.Execute(os.Stdout,\\u000A        []string{\\u000A            \\\"Go\\\",\\u000A            \\\"Rust\\\",\\u000A            \\\"C++\\\",\\u000A            \\\"C#\\\",\\u000A        })\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/tickers",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Tickers</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'timers';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'worker-pools';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"tickers\">\n      <h2><a href=\"./\">Go by Example</a>: Tickers</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"timers\">Timers</a> are for when you want to do\nsomething once in the future - <em>tickers</em> are for when\nyou want to do something repeatedly at regular\nintervals. Here&rsquo;s an example of a ticker that ticks\nperiodically until we stop it.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/gs6zoJP-Pl9\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Tickers use a similar mechanism to timers: a\nchannel that is sent values. Here we&rsquo;ll use the\n<code>select</code> builtin on the channel to await the\nvalues as they arrive every 500ms.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ticker</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">NewTicker</span><span class=\"p\">(</span><span class=\"mi\">500</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Millisecond</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">done</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">bool</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">for</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">case</span> <span class=\"o\">&lt;-</span><span class=\"nx\">done</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"k\">return</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"k\">case</span> <span class=\"nx\">t</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">ticker</span><span class=\"p\">.</span><span class=\"nx\">C</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">                <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Tick at&#34;</span><span class=\"p\">,</span> <span class=\"nx\">t</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Tickers can be stopped like timers. Once a ticker\nis stopped it won&rsquo;t receive any more values on its\nchannel. We&rsquo;ll stop ours after 1600ms.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"mi\">1600</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Millisecond</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">ticker</span><span class=\"p\">.</span><span class=\"nf\">Stop</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">done</span> <span class=\"o\">&lt;-</span> <span class=\"kc\">true</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Ticker stopped&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>When we run this program the ticker should tick 3 times\nbefore we stop it.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run tickers.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tick at 2012-09-23 11:29:56.487625 -0700 PDT\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tick at 2012-09-23 11:29:56.988063 -0700 PDT\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tick at 2012-09-23 11:29:57.488076 -0700 PDT\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Ticker stopped</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"worker-pools\" rel=\"next\">Worker Pools</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    ticker :\\u003D time.NewTicker(500 * time.Millisecond)\\u000A    done :\\u003D make(chan bool)\\u000A');codeLines.push('    go func() {\\u000A        for {\\u000A            select {\\u000A            case \\u003C-done:\\u000A                return\\u000A            case t :\\u003D \\u003C-ticker.C:\\u000A                fmt.Println(\\\"Tick at\\\", t)\\u000A            }\\u000A        }\\u000A    }()\\u000A');codeLines.push('    time.Sleep(1600 * time.Millisecond)\\u000A    ticker.Stop()\\u000A    done \\u003C- true\\u000A    fmt.Println(\\\"Ticker stopped\\\")\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/time",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Time</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'xml';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'epoch';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"time\">\n      <h2><a href=\"./\">Go by Example</a>: Time</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers extensive support for times and durations;\nhere are some examples.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/YAM3s1KPc8c\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span> <span class=\"o\">:=</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nx\">Println</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll start by getting the current time.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">now</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can build a <code>time</code> struct by providing the\nyear, month, day, etc. Times are always associated\nwith a <code>Location</code>, i.e. time zone.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">then</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Date</span><span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"mi\">2009</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">,</span> <span class=\"mi\">17</span><span class=\"p\">,</span> <span class=\"mi\">20</span><span class=\"p\">,</span> <span class=\"mi\">34</span><span class=\"p\">,</span> <span class=\"mi\">58</span><span class=\"p\">,</span> <span class=\"mi\">651387237</span><span class=\"p\">,</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">UTC</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can extract the various components of the time\nvalue as expected.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Year</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Month</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Day</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Hour</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Minute</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Second</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Nanosecond</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Location</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The Monday-Sunday <code>Weekday</code> is also available.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Weekday</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>These methods compare two times, testing if the\nfirst occurs before, after, or at the same time\nas the second, respectively.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Before</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">After</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Equal</span><span class=\"p\">(</span><span class=\"nx\">now</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>Sub</code> methods returns a <code>Duration</code> representing\nthe interval between two times.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">diff</span> <span class=\"o\">:=</span> <span class=\"nx\">now</span><span class=\"p\">.</span><span class=\"nf\">Sub</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">diff</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We can compute the length of the duration in\nvarious units.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">diff</span><span class=\"p\">.</span><span class=\"nf\">Hours</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">diff</span><span class=\"p\">.</span><span class=\"nf\">Minutes</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">diff</span><span class=\"p\">.</span><span class=\"nf\">Seconds</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">diff</span><span class=\"p\">.</span><span class=\"nf\">Nanoseconds</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can use <code>Add</code> to advance a time by a given\nduration, or with a <code>-</code> to move backwards by a\nduration.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Add</span><span class=\"p\">(</span><span class=\"nx\">diff</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">then</span><span class=\"p\">.</span><span class=\"nf\">Add</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"nx\">diff</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run time.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2012-10-31 15:50:13.793654 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2009-11-17 20:34:58.651387237 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2009\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">November\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">17\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">20\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">34\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">58\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">651387237\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tuesday\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">25891h15m15.142266763s\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">25891.25420618521\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1.5534752523711128e+06\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">9.320851514226677e+07\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">93208515142266763\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2012-10-31 15:50:13.793654 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2006-12-05 01:19:43.509120474 +0000 UTC</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at the related idea of time relative to\nthe Unix epoch.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"epoch\" rel=\"next\">Epoch</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A    p :\\u003D fmt.Println\\u000A');codeLines.push('    now :\\u003D time.Now()\\u000A    p(now)\\u000A');codeLines.push('    then :\\u003D time.Date(\\u000A        2009, 11, 17, 20, 34, 58, 651387237, time.UTC)\\u000A    p(then)\\u000A');codeLines.push('    p(then.Year())\\u000A    p(then.Month())\\u000A    p(then.Day())\\u000A    p(then.Hour())\\u000A    p(then.Minute())\\u000A    p(then.Second())\\u000A    p(then.Nanosecond())\\u000A    p(then.Location())\\u000A');codeLines.push('    p(then.Weekday())\\u000A');codeLines.push('    p(then.Before(now))\\u000A    p(then.After(now))\\u000A    p(then.Equal(now))\\u000A');codeLines.push('    diff :\\u003D now.Sub(then)\\u000A    p(diff)\\u000A');codeLines.push('    p(diff.Hours())\\u000A    p(diff.Minutes())\\u000A    p(diff.Seconds())\\u000A    p(diff.Nanoseconds())\\u000A');codeLines.push('    p(then.Add(diff))\\u000A    p(then.Add(-diff))\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/time-formatting-parsing",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Time Formatting / Parsing</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'epoch';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'random-numbers';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"time-formatting-parsing\">\n      <h2><a href=\"./\">Go by Example</a>: Time Formatting / Parsing</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go supports time formatting and parsing via\npattern-based layouts.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/0dgIUsTgEYs\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span> <span class=\"o\">:=</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nx\">Println</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a basic example of formatting a time\naccording to RFC3339, using the corresponding layout\nconstant.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Now</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Format</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">RFC3339</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Time parsing uses the same layout values as <code>Format</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t1</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">RFC3339</span><span class=\"p\">,</span> <span class=\"s\">&#34;2012-11-01T22:08:41+00:00&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">t1</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Format</code> and <code>Parse</code> use example-based layouts. Usually\nyou&rsquo;ll use a constant from <code>time</code> for these layouts, but\nyou can also supply custom layouts. Layouts must use the\nreference time <code>Mon Jan 2 15:04:05 MST 2006</code> to show the\npattern with which to format/parse a given time/string.\nThe example time must be exactly as shown: the year 2006,\n15 for the hour, Monday for the day of the week, etc.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Format</span><span class=\"p\">(</span><span class=\"s\">&#34;3:04PM&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Format</span><span class=\"p\">(</span><span class=\"s\">&#34;Mon Jan _2 15:04:05 2006&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Format</span><span class=\"p\">(</span><span class=\"s\">&#34;2006-01-02T15:04:05.999999-07:00&#34;</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">form</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;3 04 PM&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">t2</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"nx\">form</span><span class=\"p\">,</span> <span class=\"s\">&#34;8 41 PM&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">t2</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For purely numeric representations you can also\nuse standard string formatting with the extracted\ncomponents of the time value.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;%d-%02d-%02dT%02d:%02d:%02d-00:00\\n&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Year</span><span class=\"p\">(),</span> <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Month</span><span class=\"p\">(),</span> <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Day</span><span class=\"p\">(),</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Hour</span><span class=\"p\">(),</span> <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Minute</span><span class=\"p\">(),</span> <span class=\"nx\">t</span><span class=\"p\">.</span><span class=\"nf\">Second</span><span class=\"p\">())</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>Parse</code> will return an error on malformed input\nexplaining the parsing problem.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"s\">&#34;Mon Jan _2 15:04:05 2006&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;8:41PM&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">p</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run time-formatting-parsing.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2014-04-15T18:00:15-07:00\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2012-11-01 22:08:41 +0000 +0000\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">6:00PM\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Tue Apr 15 18:00:15 2014\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2014-04-15T18:00:15.161182-07:00\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">0000-01-01 20:41:00 +0000 UTC\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">2014-04-15T18:00:15-00:00\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">parsing time &#34;8:41PM&#34; as &#34;Mon Jan _2 15:04:05 2006&#34;: ...</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"random-numbers\" rel=\"next\">Random Numbers</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A    p :\\u003D fmt.Println\\u000A');codeLines.push('    t :\\u003D time.Now()\\u000A    p(t.Format(time.RFC3339))\\u000A');codeLines.push('    t1, _ :\\u003D time.Parse(time.RFC3339, \\\"2012-11-01T22:08:41+00:00\\\")\\u000A    p(t1)\\u000A');codeLines.push('    p(t.Format(\\\"3:04PM\\\"))\\u000A    p(t.Format(\\\"Mon Jan _2 15:04:05 2006\\\"))\\u000A    p(t.Format(\\\"2006-01-02T15:04:05.999999-07:00\\\"))\\u000A    form :\\u003D \\\"3 04 PM\\\"\\u000A    t2, _ :\\u003D time.Parse(form, \\\"8 41 PM\\\")\\u000A    p(t2)\\u000A');codeLines.push('    fmt.Printf(\\\"%d-%02d-%02dT%02d:%02d:%02d-00:00\\\\n\\\",\\u000A        t.Year(), t.Month(), t.Day(),\\u000A        t.Hour(), t.Minute(), t.Second())\\u000A');codeLines.push('    _, err :\\u003D time.Parse(\\\"Mon Jan _2 15:04:05 2006\\\", \\\"8:41PM\\\")\\u000A    p(err)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/timeouts",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Timeouts</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'select';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'non-blocking-channel-operations';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"timeouts\">\n      <h2><a href=\"./\">Go by Example</a>: Timeouts</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><em>Timeouts</em> are important for programs that connect to\nexternal resources or that otherwise need to bound\nexecution time. Implementing timeouts in Go is easy and\nelegant thanks to channels and <code>select</code>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/gyr0NbVKBVf\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For our example, suppose we&rsquo;re executing an external\ncall that returns its result on a channel <code>c1</code>\nafter 2s. Note that the channel is buffered, so the\nsend in the goroutine is nonblocking. This is a\ncommon pattern to prevent goroutine leaks in case the\nchannel is never read.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c1</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">c1</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;result 1&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s the <code>select</code> implementing a timeout.\n<code>res := &lt;-c1</code> awaits the result and <code>&lt;-time.After</code>\nawaits a value to be sent after the timeout of\n1s. Since <code>select</code> proceeds with the first\nreceive that&rsquo;s ready, we&rsquo;ll take the timeout case\nif the operation takes more than the allowed 1s.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">res</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">c1</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">res</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"o\">&lt;-</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">After</span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">):</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;timeout 1&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If we allow a longer timeout of 3s, then the receive\nfrom <code>c2</code> will succeed and we&rsquo;ll print the result.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">c2</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">string</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">c2</span> <span class=\"o\">&lt;-</span> <span class=\"s\">&#34;result 2&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">select</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"nx\">res</span> <span class=\"o\">:=</span> <span class=\"o\">&lt;-</span><span class=\"nx\">c2</span><span class=\"p\">:</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">res</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">case</span> <span class=\"o\">&lt;-</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">After</span><span class=\"p\">(</span><span class=\"mi\">3</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">):</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;timeout 2&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running this program shows the first operation timing\nout and the second succeeding.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run timeouts.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">timeout 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">result 2</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"non-blocking-channel-operations\" rel=\"next\">Non-Blocking Channel Operations</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    c1 :\\u003D make(chan string, 1)\\u000A    go func() {\\u000A        time.Sleep(2 * time.Second)\\u000A        c1 \\u003C- \\\"result 1\\\"\\u000A    }()\\u000A');codeLines.push('    select {\\u000A    case res :\\u003D \\u003C-c1:\\u000A        fmt.Println(res)\\u000A    case \\u003C-time.After(1 * time.Second):\\u000A        fmt.Println(\\\"timeout 1\\\")\\u000A    }\\u000A');codeLines.push('    c2 :\\u003D make(chan string, 1)\\u000A    go func() {\\u000A        time.Sleep(2 * time.Second)\\u000A        c2 \\u003C- \\\"result 2\\\"\\u000A    }()\\u000A    select {\\u000A    case res :\\u003D \\u003C-c2:\\u000A        fmt.Println(res)\\u000A    case \\u003C-time.After(3 * time.Second):\\u000A        fmt.Println(\\\"timeout 2\\\")\\u000A    }\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/timers",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Timers</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'range-over-channels';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'tickers';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"timers\">\n      <h2><a href=\"./\">Go by Example</a>: Timers</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We often want to execute Go code at some point in the\nfuture, or repeatedly at some interval. Go&rsquo;s built-in\n<em>timer</em> and <em>ticker</em> features make both of these tasks\neasy. We&rsquo;ll look first at timers and then\nat <a href=\"tickers\">tickers</a>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/gF7VLRz3URM\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Timers represent a single event in the future. You\ntell the timer how long you want to wait, and it\nprovides a channel that will be notified at that\ntime. This timer will wait 2 seconds.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">timer1</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">NewTimer</span><span class=\"p\">(</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>&lt;-timer1.C</code> blocks on the timer&rsquo;s channel <code>C</code>\nuntil it sends a value indicating that the timer\nfired.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"o\">&lt;-</span><span class=\"nx\">timer1</span><span class=\"p\">.</span><span class=\"nx\">C</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Timer 1 fired&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you just wanted to wait, you could have used\n<code>time.Sleep</code>. One reason a timer may be useful is\nthat you can cancel the timer before it fires.\nHere&rsquo;s an example of that.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">timer2</span> <span class=\"o\">:=</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">NewTimer</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">go</span> <span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"o\">&lt;-</span><span class=\"nx\">timer2</span><span class=\"p\">.</span><span class=\"nx\">C</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Timer 2 fired&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">stop2</span> <span class=\"o\">:=</span> <span class=\"nx\">timer2</span><span class=\"p\">.</span><span class=\"nf\">Stop</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">stop2</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;Timer 2 stopped&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Give the <code>timer2</code> enough time to fire, if it ever\nwas going to, to show it is in fact stopped.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The first timer will fire ~2s after we start the\nprogram, but the second should be stopped before it has\na chance to fire.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run timers.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Timer 1 fired\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Timer 2 stopped</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"tickers\" rel=\"next\">Tickers</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    timer1 :\\u003D time.NewTimer(2 * time.Second)\\u000A');codeLines.push('    \\u003C-timer1.C\\u000A    fmt.Println(\\\"Timer 1 fired\\\")\\u000A');codeLines.push('    timer2 :\\u003D time.NewTimer(time.Second)\\u000A    go func() {\\u000A        \\u003C-timer2.C\\u000A        fmt.Println(\\\"Timer 2 fired\\\")\\u000A    }()\\u000A    stop2 :\\u003D timer2.Stop()\\u000A    if stop2 {\\u000A        fmt.Println(\\\"Timer 2 stopped\\\")\\u000A    }\\u000A');codeLines.push('    time.Sleep(2 * time.Second)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/url-parsing",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: URL Parsing</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'number-parsing';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'sha256-hashes';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"url-parsing\">\n      <h2><a href=\"./\">Go by Example</a>: URL Parsing</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>URLs provide a <a href=\"https://adam.herokuapp.com/past/2010/3/30/urls_are_the_uniform_way_to_locate_resources/\">uniform way to locate resources</a>.\nHere&rsquo;s how to parse URLs in Go.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/fHTQn9X7l1B\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;net&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;net/url&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>We&rsquo;ll parse this example URL, which includes a\nscheme, authentication info, host, port, path,\nquery params, and query fragment.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">s</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;postgres://user:pass@host.com:5432/path?k=v#f&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Parse the URL and ensure there are no errors.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">u</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">url</span><span class=\"p\">.</span><span class=\"nf\">Parse</span><span class=\"p\">(</span><span class=\"nx\">s</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Accessing the scheme is straightforward.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">Scheme</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>User</code> contains all authentication info; call\n<code>Username</code> and <code>Password</code> on this for individual\nvalues.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">User</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">User</span><span class=\"p\">.</span><span class=\"nf\">Username</span><span class=\"p\">())</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">p</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">User</span><span class=\"p\">.</span><span class=\"nf\">Password</span><span class=\"p\">()</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>Host</code> contains both the hostname and the port,\nif present. Use <code>SplitHostPort</code> to extract them.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">Host</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">host</span><span class=\"p\">,</span> <span class=\"nx\">port</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">net</span><span class=\"p\">.</span><span class=\"nf\">SplitHostPort</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">Host</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">host</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">port</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we extract the <code>path</code> and the fragment after\nthe <code>#</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">Path</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">Fragment</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To get query params in a string of <code>k=v</code> format,\nuse <code>RawQuery</code>. You can also parse query params\ninto a map. The parsed query param maps are from\nstrings to slices of strings, so index into <code>[0]</code>\nif you only want the first value.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">RawQuery</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">m</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">url</span><span class=\"p\">.</span><span class=\"nf\">ParseQuery</span><span class=\"p\">(</span><span class=\"nx\">u</span><span class=\"p\">.</span><span class=\"nx\">RawQuery</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">m</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">m</span><span class=\"p\">[</span><span class=\"s\">&#34;k&#34;</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Running our URL parsing program shows all the different\npieces that we extracted.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run url-parsing.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">postgres\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">user:pass\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">user\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">pass\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">host.com:5432\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">host.com\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">5432\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">/path\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">f\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">k=v\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">map[k:[v]]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">v</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"sha256-hashes\" rel=\"next\">SHA256 Hashes</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"net\\\"\\u000A    \\\"net/url\\\"\\u000A)\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    s :\\u003D \\\"postgres://user:pass@host.com:5432/path?k\\u003Dv#f\\\"\\u000A');codeLines.push('    u, err :\\u003D url.Parse(s)\\u000A    if err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A');codeLines.push('    fmt.Println(u.Scheme)\\u000A');codeLines.push('    fmt.Println(u.User)\\u000A    fmt.Println(u.User.Username())\\u000A    p, _ :\\u003D u.User.Password()\\u000A    fmt.Println(p)\\u000A');codeLines.push('    fmt.Println(u.Host)\\u000A    host, port, _ :\\u003D net.SplitHostPort(u.Host)\\u000A    fmt.Println(host)\\u000A    fmt.Println(port)\\u000A');codeLines.push('    fmt.Println(u.Path)\\u000A    fmt.Println(u.Fragment)\\u000A');codeLines.push('    fmt.Println(u.RawQuery)\\u000A    m, _ :\\u003D url.ParseQuery(u.RawQuery)\\u000A    fmt.Println(m)\\u000A    fmt.Println(m[\\\"k\\\"][0])\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/values",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Values</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'hello-world';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'variables';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"values\">\n      <h2><a href=\"./\">Go by Example</a>: Values</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go has various value types including strings,\nintegers, floats, booleans, etc. Here are a few\nbasic examples.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/YnVS3LZr8pk\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Strings, which can be added together with <code>+</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;go&#34;</span> <span class=\"o\">+</span> <span class=\"s\">&#34;lang&#34;</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Integers and floats.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;1+1 =&#34;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;7.0/3.0 =&#34;</span><span class=\"p\">,</span> <span class=\"mf\">7.0</span><span class=\"o\">/</span><span class=\"mf\">3.0</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Booleans, with boolean operators as you&rsquo;d expect.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"kc\">true</span> <span class=\"o\">&amp;&amp;</span> <span class=\"kc\">false</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"kc\">true</span> <span class=\"o\">||</span> <span class=\"kc\">false</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(!</span><span class=\"kc\">true</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run values.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">golang\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1+1 = 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">7.0/3.0 = 2.3333333333333335\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">false\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">false</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"variables\" rel=\"next\">Variables</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    fmt.Println(\\\"go\\\" + \\\"lang\\\")\\u000A');codeLines.push('    fmt.Println(\\\"1+1 \\u003D\\\", 1+1)\\u000A    fmt.Println(\\\"7.0/3.0 \\u003D\\\", 7.0/3.0)\\u000A');codeLines.push('    fmt.Println(true \\u0026\\u0026 false)\\u000A    fmt.Println(true || false)\\u000A    fmt.Println(!true)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/variables",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Variables</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'values';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'constants';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"variables\">\n      <h2><a href=\"./\">Go by Example</a>: Variables</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In Go, <em>variables</em> are explicitly declared and used by\nthe compiler to e.g. check type-correctness of function\ncalls.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/N5rWndIliJW\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>var</code> declares 1 or more variables.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">a</span> <span class=\"p\">=</span> <span class=\"s\">&#34;initial&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can declare multiple variables at once.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">b</span><span class=\"p\">,</span> <span class=\"nx\">c</span> <span class=\"kt\">int</span> <span class=\"p\">=</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">b</span><span class=\"p\">,</span> <span class=\"nx\">c</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go will infer the type of initialized variables.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">d</span> <span class=\"p\">=</span> <span class=\"kc\">true</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">d</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Variables declared without a corresponding\ninitialization are <em>zero-valued</em>. For example, the\nzero value for an <code>int</code> is <code>0</code>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">e</span> <span class=\"kt\">int</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>:=</code> syntax is shorthand for declaring and\ninitializing a variable, e.g. for\n<code>var f string = &quot;apple&quot;</code> in this case.\nThis syntax is only available inside functions.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span> <span class=\"o\">:=</span> <span class=\"s\">&#34;apple&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run variables.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">initial\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">1 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">true\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">0\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">apple</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"constants\" rel=\"next\">Constants</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    var a \\u003D \\\"initial\\\"\\u000A    fmt.Println(a)\\u000A');codeLines.push('    var b, c int \\u003D 1, 2\\u000A    fmt.Println(b, c)\\u000A');codeLines.push('    var d \\u003D true\\u000A    fmt.Println(d)\\u000A');codeLines.push('    var e int\\u000A    fmt.Println(e)\\u000A');codeLines.push('    f :\\u003D \\\"apple\\\"\\u000A    fmt.Println(f)\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/variadic-functions",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Variadic Functions</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'multiple-return-values';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'closures';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"variadic-functions\">\n      <h2><a href=\"./\">Go by Example</a>: Variadic Functions</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><a href=\"https://en.wikipedia.org/wiki/Variadic_function\"><em>Variadic functions</em></a>\ncan be called with any number of trailing arguments.\nFor example, <code>fmt.Println</code> is a common variadic\nfunction.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/glNdE8aKPNq\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"s\">&#34;fmt&#34;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s a function that will take an arbitrary number\nof <code>int</code>s as arguments.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"nx\">nums</span> <span class=\"o\">...</span><span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Print</span><span class=\"p\">(</span><span class=\"nx\">nums</span><span class=\"p\">,</span> <span class=\"s\">&#34; &#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">total</span> <span class=\"o\">:=</span> <span class=\"mi\">0</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Within the function, the type of <code>nums</code> is\nequivalent to <code>[]int</code>. We can call <code>len(nums)</code>,\niterate over it with <code>range</code>, etc.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">_</span><span class=\"p\">,</span> <span class=\"nx\">num</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">nums</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">total</span> <span class=\"o\">+=</span> <span class=\"nx\">num</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">total</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Variadic functions can be called in the usual way\nwith individual arguments.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>If you already have multiple args in a slice,\napply them to a variadic function using\n<code>func(slice...)</code> like this.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">nums</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">int</span><span class=\"p\">{</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"nx\">nums</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run variadic-functions.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[1 2] 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[1 2 3] 6\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">[1 2 3 4] 10</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Another key aspect of functions in Go is their ability\nto form closures, which we&rsquo;ll look at next.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"closures\" rel=\"next\">Closures</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import \\\"fmt\\\"\\u000A');codeLines.push('func sum(nums ...int) {\\u000A    fmt.Print(nums, \\\" \\\")\\u000A    total :\\u003D 0\\u000A');codeLines.push('    for _, num :\\u003D range nums {\\u000A        total +\\u003D num\\u000A    }\\u000A    fmt.Println(total)\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    sum(1, 2)\\u000A    sum(1, 2, 3)\\u000A');codeLines.push('    nums :\\u003D []int{1, 2, 3, 4}\\u000A    sum(nums...)\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/waitgroups",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: WaitGroups</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'worker-pools';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'rate-limiting';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"waitgroups\">\n      <h2><a href=\"./\">Go by Example</a>: WaitGroups</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To wait for multiple goroutines to finish, we can\nuse a <em>wait group</em>.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/csaELahJTWt\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;sync&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This is the function we&rsquo;ll run in every goroutine.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nx\">id</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;Worker %d starting\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">id</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Sleep to simulate an expensive task.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;Worker %d done\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">id</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This WaitGroup is used to wait for all the\ngoroutines launched here to finish. Note: if a WaitGroup is\nexplicitly passed into functions, it should be done <em>by pointer</em>.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">wg</span> <span class=\"nx\">sync</span><span class=\"p\">.</span><span class=\"nx\">WaitGroup</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Launch several goroutines using <code>WaitGroup.Go</code></p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">i</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">i</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">5</span><span class=\"p\">;</span> <span class=\"nx\">i</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Go</span><span class=\"p\">(</span><span class=\"kd\">func</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">            <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nx\">i</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"p\">})</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Block until all the goroutines started by <code>wg</code> are\ndone. A goroutine is done when the function it invokes\nreturns.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">wg</span><span class=\"p\">.</span><span class=\"nf\">Wait</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Note that this approach has no straightforward way\nto propagate errors from workers. For more\nadvanced use cases, consider using the\n<a href=\"https://pkg.go.dev/golang.org/x/sync/errgroup\">errgroup package</a>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run waitgroups.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 5 starting\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 3 starting\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 4 starting\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 1 starting\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 2 starting\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 4 done\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 1 done\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 2 done\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 5 done\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Worker 3 done</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The order of workers starting up and finishing\nis likely to be different for each invocation.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"rate-limiting\" rel=\"next\">Rate Limiting</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"sync\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func worker(id int) {\\u000A    fmt.Printf(\\\"Worker %d starting\\\\n\\\", id)\\u000A');codeLines.push('    time.Sleep(time.Second)\\u000A    fmt.Printf(\\\"Worker %d done\\\\n\\\", id)\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    var wg sync.WaitGroup\\u000A');codeLines.push('    for i :\\u003D 1; i \\u003C\\u003D 5; i++ {\\u000A        wg.Go(func() {\\u000A            worker(i)\\u000A        })\\u000A    }\\u000A');codeLines.push('    wg.Wait()\\u000A');codeLines.push('}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/worker-pools",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Worker Pools</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'tickers';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'waitgroups';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"worker-pools\">\n      <h2><a href=\"./\">Go by Example</a>: Worker Pools</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In this example we&rsquo;ll look at how to implement\na <em>worker pool</em> using goroutines and channels.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/hiSJJsYZJKL\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;time&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here&rsquo;s the worker, of which we&rsquo;ll run several\nconcurrent instances. These workers will receive\nwork on the <code>jobs</code> channel and send the corresponding\nresults on <code>results</code>. We&rsquo;ll sleep a second per job to\nsimulate an expensive task.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nx\">id</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"nx\">jobs</span> <span class=\"o\">&lt;-</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"nx\">results</span> <span class=\"kd\">chan</span><span class=\"o\">&lt;-</span> <span class=\"kt\">int</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">j</span> <span class=\"o\">:=</span> <span class=\"k\">range</span> <span class=\"nx\">jobs</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;worker&#34;</span><span class=\"p\">,</span> <span class=\"nx\">id</span><span class=\"p\">,</span> <span class=\"s\">&#34;started  job&#34;</span><span class=\"p\">,</span> <span class=\"nx\">j</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nf\">Sleep</span><span class=\"p\">(</span><span class=\"nx\">time</span><span class=\"p\">.</span><span class=\"nx\">Second</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">&#34;worker&#34;</span><span class=\"p\">,</span> <span class=\"nx\">id</span><span class=\"p\">,</span> <span class=\"s\">&#34;finished job&#34;</span><span class=\"p\">,</span> <span class=\"nx\">j</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">results</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">j</span> <span class=\"o\">*</span> <span class=\"mi\">2</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>In order to use our pool of workers we need to send\nthem work and collect their results. We make 2\nchannels for this.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">const</span> <span class=\"nx\">numJobs</span> <span class=\"p\">=</span> <span class=\"mi\">5</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">jobs</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"nx\">numJobs</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">results</span> <span class=\"o\">:=</span> <span class=\"nb\">make</span><span class=\"p\">(</span><span class=\"kd\">chan</span> <span class=\"kt\">int</span><span class=\"p\">,</span> <span class=\"nx\">numJobs</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>This starts up 3 workers, initially blocked\nbecause there are no jobs yet.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">w</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">w</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">3</span><span class=\"p\">;</span> <span class=\"nx\">w</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"k\">go</span> <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nx\">w</span><span class=\"p\">,</span> <span class=\"nx\">jobs</span><span class=\"p\">,</span> <span class=\"nx\">results</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Here we send 5 <code>jobs</code> and then <code>close</code> that\nchannel to indicate that&rsquo;s all the work we have.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">j</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">j</span> <span class=\"o\">&lt;=</span> <span class=\"nx\">numJobs</span><span class=\"p\">;</span> <span class=\"nx\">j</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">jobs</span> <span class=\"o\">&lt;-</span> <span class=\"nx\">j</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">close</span><span class=\"p\">(</span><span class=\"nx\">jobs</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Finally we collect all the results of the work.\nThis also ensures that the worker goroutines have\nfinished. An alternative way to wait for multiple\ngoroutines is to use a <a href=\"waitgroups\">WaitGroup</a>.</p>\n\n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">for</span> <span class=\"nx\">a</span> <span class=\"o\">:=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">a</span> <span class=\"o\">&lt;=</span> <span class=\"nx\">numJobs</span><span class=\"p\">;</span> <span class=\"nx\">a</span><span class=\"o\">++</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"o\">&lt;-</span><span class=\"nx\">results</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Our running program shows the 5 jobs being executed by\nvarious workers. The program only takes about 2 seconds\ndespite doing about 5 seconds of total work because\nthere are 3 workers operating concurrently.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> time go run worker-pools.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 1 started  job 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 2 started  job 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 3 started  job 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 1 finished job 1\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 1 started  job 4\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 2 finished job 2\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 2 started  job 5\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 3 finished job 3\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 1 finished job 4\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">worker 2 finished job 5</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"go\">real    0m2.358s</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"waitgroups\" rel=\"next\">WaitGroups</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"fmt\\\"\\u000A    \\\"time\\\"\\u000A)\\u000A');codeLines.push('func worker(id int, jobs \\u003C-chan int, results chan\\u003C- int) {\\u000A    for j :\\u003D range jobs {\\u000A        fmt.Println(\\\"worker\\\", id, \\\"started  job\\\", j)\\u000A        time.Sleep(time.Second)\\u000A        fmt.Println(\\\"worker\\\", id, \\\"finished job\\\", j)\\u000A        results \\u003C- j * 2\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    const numJobs \\u003D 5\\u000A    jobs :\\u003D make(chan int, numJobs)\\u000A    results :\\u003D make(chan int, numJobs)\\u000A');codeLines.push('    for w :\\u003D 1; w \\u003C\\u003D 3; w++ {\\u000A        go worker(w, jobs, results)\\u000A    }\\u000A');codeLines.push('    for j :\\u003D 1; j \\u003C\\u003D numJobs; j++ {\\u000A        jobs \\u003C- j\\u000A    }\\u000A    close(jobs)\\u000A');codeLines.push('    for a :\\u003D 1; a \\u003C\\u003D numJobs; a++ {\\u000A        \\u003C-results\\u000A    }\\u000A}\\u000A');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/writing-files",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Writing Files</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'reading-files';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'line-filters';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"writing-files\">\n      <h2><a href=\"./\">Go by Example</a>: Writing Files</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Writing files in Go follows similar patterns to the\nones we saw earlier for reading.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/iuKQDnKfl2T\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;bufio&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;os&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;path/filepath&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">e</span> <span class=\"kt\">error</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">e</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To start, here&rsquo;s how to dump a string (or just\nbytes) into a file.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">d1</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"nb\">byte</span><span class=\"p\">(</span><span class=\"s\">&#34;hello\\ngo\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">path1</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">TempDir</span><span class=\"p\">(),</span> <span class=\"s\">&#34;dat1&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">WriteFile</span><span class=\"p\">(</span><span class=\"nx\">path1</span><span class=\"p\">,</span> <span class=\"nx\">d1</span><span class=\"p\">,</span> <span class=\"mo\">0644</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>For more granular writes, open a file for writing.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">path2</span> <span class=\"o\">:=</span> <span class=\"nx\">filepath</span><span class=\"p\">.</span><span class=\"nf\">Join</span><span class=\"p\">(</span><span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">TempDir</span><span class=\"p\">(),</span> <span class=\"s\">&#34;dat2&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">os</span><span class=\"p\">.</span><span class=\"nf\">Create</span><span class=\"p\">(</span><span class=\"nx\">path2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>It&rsquo;s idiomatic to defer a <code>Close</code> immediately\nafter opening a file.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Close</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>You can <code>Write</code> byte slices as you&rsquo;d expect.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">d2</span> <span class=\"o\">:=</span> <span class=\"p\">[]</span><span class=\"kt\">byte</span><span class=\"p\">{</span><span class=\"mi\">115</span><span class=\"p\">,</span> <span class=\"mi\">111</span><span class=\"p\">,</span> <span class=\"mi\">109</span><span class=\"p\">,</span> <span class=\"mi\">101</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n2</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Write</span><span class=\"p\">(</span><span class=\"nx\">d2</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;wrote %d bytes\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">n2</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>A <code>WriteString</code> is also available.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n3</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">WriteString</span><span class=\"p\">(</span><span class=\"s\">&#34;writes\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;wrote %d bytes\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">n3</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Issue a <code>Sync</code> to flush writes to stable storage.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">f</span><span class=\"p\">.</span><span class=\"nf\">Sync</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p><code>bufio</code> provides buffered writers in addition\nto the buffered readers we saw earlier.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">w</span> <span class=\"o\">:=</span> <span class=\"nx\">bufio</span><span class=\"p\">.</span><span class=\"nf\">NewWriter</span><span class=\"p\">(</span><span class=\"nx\">f</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">n4</span><span class=\"p\">,</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">w</span><span class=\"p\">.</span><span class=\"nf\">WriteString</span><span class=\"p\">(</span><span class=\"s\">&#34;buffered\\n&#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Printf</span><span class=\"p\">(</span><span class=\"s\">&#34;wrote %d bytes\\n&#34;</span><span class=\"p\">,</span> <span class=\"nx\">n4</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>Flush</code> to ensure all buffered operations have\nbeen applied to the underlying writer.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">w</span><span class=\"p\">.</span><span class=\"nf\">Flush</span><span class=\"p\">()</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Try running the file-writing code.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run writing-files.go \n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">wrote 5 bytes\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">wrote 7 bytes\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">wrote 9 bytes</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Then check the contents of the written files.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> cat /tmp/dat1\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">hello\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">go\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"></span><span class=\"gp\">$</span> cat /tmp/dat2\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">some\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">writes\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">buffered</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Next we&rsquo;ll look at applying some of the file I/O ideas\nwe&rsquo;ve just seen to the <code>stdin</code> and <code>stdout</code> streams.</p>\n\n          </td>\n          <td class=\"code empty\">\n            \n          \n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"line-filters\" rel=\"next\">Line Filters</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"bufio\\\"\\u000A    \\\"fmt\\\"\\u000A    \\\"os\\\"\\u000A    \\\"path/filepath\\\"\\u000A)\\u000A');codeLines.push('func check(e error) {\\u000A    if e !\\u003D nil {\\u000A        panic(e)\\u000A    }\\u000A}\\u000A');codeLines.push('func main() {\\u000A');codeLines.push('    d1 :\\u003D []byte(\\\"hello\\\\ngo\\\\n\\\")\\u000A    path1 :\\u003D filepath.Join(os.TempDir(), \\\"dat1\\\")\\u000A    err :\\u003D os.WriteFile(path1, d1, 0644)\\u000A    check(err)\\u000A');codeLines.push('    path2 :\\u003D filepath.Join(os.TempDir(), \\\"dat2\\\")\\u000A    f, err :\\u003D os.Create(path2)\\u000A    check(err)\\u000A');codeLines.push('    defer f.Close()\\u000A');codeLines.push('    d2 :\\u003D []byte{115, 111, 109, 101, 10}\\u000A    n2, err :\\u003D f.Write(d2)\\u000A    check(err)\\u000A    fmt.Printf(\\\"wrote %d bytes\\\\n\\\", n2)\\u000A');codeLines.push('    n3, err :\\u003D f.WriteString(\\\"writes\\\\n\\\")\\u000A    check(err)\\u000A    fmt.Printf(\\\"wrote %d bytes\\\\n\\\", n3)\\u000A');codeLines.push('    f.Sync()\\u000A');codeLines.push('    w :\\u003D bufio.NewWriter(f)\\u000A    n4, err :\\u003D w.WriteString(\\\"buffered\\\\n\\\")\\u000A    check(err)\\u000A    fmt.Printf(\\\"wrote %d bytes\\\\n\\\", n4)\\u000A');codeLines.push('    w.Flush()\\u000A');codeLines.push('}\\u000A');codeLines.push('');codeLines.push('');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "public/xml",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: XML</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          \n          if (e.key == \"ArrowLeft\") {\n              window.location.href = 'json';\n          }\n          \n          \n          if (e.key == \"ArrowRight\") {\n              window.location.href = 'time';\n          }\n          \n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"xml\">\n      <h2><a href=\"./\">Go by Example</a>: XML</h2>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Go offers built-in support for XML and XML-like\nformats with the <code>encoding/xml</code> package.</p>\n\n          </td>\n          <td class=\"code empty leading\">\n            \n          \n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            <a href=\"https://go.dev/play/p/vsP5mIrNJOG\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />\n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">package</span> <span class=\"nx\">main</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kn\">import</span> <span class=\"p\">(</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;encoding/xml&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"s\">&#34;fmt&#34;</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Plant will be mapped to XML. Similarly to the\nJSON examples, field tags contain directives for the\nencoder and decoder. Here we use some special features\nof the XML package: the <code>XMLName</code> field name dictates\nthe name of the XML element representing this struct;\n<code>id,attr</code> means that the <code>Id</code> field is an XML\n<em>attribute</em> rather than a nested element.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type</span> <span class=\"nx\">Plant</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">XMLName</span> <span class=\"nx\">xml</span><span class=\"p\">.</span><span class=\"nx\">Name</span> <span class=\"s\">`xml:&#34;plant&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Id</span>      <span class=\"kt\">int</span>      <span class=\"s\">`xml:&#34;id,attr&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Name</span>    <span class=\"kt\">string</span>   <span class=\"s\">`xml:&#34;name&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">Origin</span>  <span class=\"p\">[]</span><span class=\"kt\">string</span> <span class=\"s\">`xml:&#34;origin&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"p\">(</span><span class=\"nx\">p</span> <span class=\"nx\">Plant</span><span class=\"p\">)</span> <span class=\"nf\">String</span><span class=\"p\">()</span> <span class=\"kt\">string</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">return</span> <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Sprintf</span><span class=\"p\">(</span><span class=\"s\">&#34;Plant id=%v, name=%v, origin=%v&#34;</span><span class=\"p\">,</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">p</span><span class=\"p\">.</span><span class=\"nx\">Id</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">.</span><span class=\"nx\">Name</span><span class=\"p\">,</span> <span class=\"nx\">p</span><span class=\"p\">.</span><span class=\"nx\">Origin</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">coffee</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">Plant</span><span class=\"p\">{</span><span class=\"nx\">Id</span><span class=\"p\">:</span> <span class=\"mi\">27</span><span class=\"p\">,</span> <span class=\"nx\">Name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Coffee&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">coffee</span><span class=\"p\">.</span><span class=\"nx\">Origin</span> <span class=\"p\">=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;Ethiopia&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;Brazil&#34;</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Emit XML representing our plant; using\n<code>MarshalIndent</code> to produce a more\nhuman-readable output.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">out</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"o\">:=</span> <span class=\"nx\">xml</span><span class=\"p\">.</span><span class=\"nf\">MarshalIndent</span><span class=\"p\">(</span><span class=\"nx\">coffee</span><span class=\"p\">,</span> <span class=\"s\">&#34; &#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;  &#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">out</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>To add a generic XML header to the output, append\nit explicitly.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">xml</span><span class=\"p\">.</span><span class=\"nx\">Header</span> <span class=\"o\">+</span> <span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">out</span><span class=\"p\">))</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>Use <code>Unmarshal</code> to parse a stream of bytes with XML\ninto a data structure. If the XML is malformed or\ncannot be mapped onto Plant, a descriptive error\nwill be returned.</p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">var</span> <span class=\"nx\">p</span> <span class=\"nx\">Plant</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">if</span> <span class=\"nx\">err</span> <span class=\"o\">:=</span> <span class=\"nx\">xml</span><span class=\"p\">.</span><span class=\"nf\">Unmarshal</span><span class=\"p\">(</span><span class=\"nx\">out</span><span class=\"p\">,</span> <span class=\"o\">&amp;</span><span class=\"nx\">p</span><span class=\"p\">);</span> <span class=\"nx\">err</span> <span class=\"o\">!=</span> <span class=\"kc\">nil</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nb\">panic</span><span class=\"p\">(</span><span class=\"nx\">err</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nx\">p</span><span class=\"p\">)</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">tomato</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">Plant</span><span class=\"p\">{</span><span class=\"nx\">Id</span><span class=\"p\">:</span> <span class=\"mi\">81</span><span class=\"p\">,</span> <span class=\"nx\">Name</span><span class=\"p\">:</span> <span class=\"s\">&#34;Tomato&#34;</span><span class=\"p\">}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">tomato</span><span class=\"p\">.</span><span class=\"nx\">Origin</span> <span class=\"p\">=</span> <span class=\"p\">[]</span><span class=\"kt\">string</span><span class=\"p\">{</span><span class=\"s\">&#34;Mexico&#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;California&#34;</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            <p>The <code>parent&gt;child&gt;plant</code> field tag tells the encoder\nto nest all <code>plant</code>s under <code>&lt;parent&gt;&lt;child&gt;...</code></p>\n\n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"kd\">type</span> <span class=\"nx\">Nesting</span> <span class=\"kd\">struct</span> <span class=\"p\">{</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">XMLName</span> <span class=\"nx\">xml</span><span class=\"p\">.</span><span class=\"nx\">Name</span> <span class=\"s\">`xml:&#34;nesting&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">Plants</span>  <span class=\"p\">[]</span><span class=\"o\">*</span><span class=\"nx\">Plant</span> <span class=\"s\">`xml:&#34;parent&gt;child&gt;plant&#34;`</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code leading\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">nesting</span> <span class=\"o\">:=</span> <span class=\"o\">&amp;</span><span class=\"nx\">Nesting</span><span class=\"p\">{}</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">nesting</span><span class=\"p\">.</span><span class=\"nx\">Plants</span> <span class=\"p\">=</span> <span class=\"p\">[]</span><span class=\"o\">*</span><span class=\"nx\">Plant</span><span class=\"p\">{</span><span class=\"nx\">coffee</span><span class=\"p\">,</span> <span class=\"nx\">tomato</span><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">out</span><span class=\"p\">,</span> <span class=\"nx\">_</span> <span class=\"p\">=</span> <span class=\"nx\">xml</span><span class=\"p\">.</span><span class=\"nf\">MarshalIndent</span><span class=\"p\">(</span><span class=\"nx\">nesting</span><span class=\"p\">,</span> <span class=\"s\">&#34; &#34;</span><span class=\"p\">,</span> <span class=\"s\">&#34;  &#34;</span><span class=\"p\">)</span>\n</span></span><span class=\"line\"><span class=\"cl\">    <span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"nb\">string</span><span class=\"p\">(</span><span class=\"nx\">out</span><span class=\"p\">))</span>\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      <table>\n        \n        <tr>\n          <td class=\"docs\">\n            \n          </td>\n          <td class=\"code\">\n            \n          <pre class=\"chroma\"><code><span class=\"line\"><span class=\"cl\"><span class=\"gp\">$</span> go run xml.go\n</span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &lt;plant id=&#34;27&#34;&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;name&gt;Coffee&lt;/name&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;origin&gt;Ethiopia&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;origin&gt;Brazil&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &lt;/plant&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &lt;plant id=&#34;27&#34;&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;name&gt;Coffee&lt;/name&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;origin&gt;Ethiopia&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;origin&gt;Brazil&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &lt;/plant&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">Plant id=27, name=Coffee, origin=[Ethiopia Brazil]\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &lt;nesting&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;parent&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">     &lt;child&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">       &lt;plant id=&#34;27&#34;&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">         &lt;name&gt;Coffee&lt;/name&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">         &lt;origin&gt;Ethiopia&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">         &lt;origin&gt;Brazil&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">       &lt;/plant&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">       &lt;plant id=&#34;81&#34;&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">         &lt;name&gt;Tomato&lt;/name&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">         &lt;origin&gt;Mexico&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">         &lt;origin&gt;California&lt;/origin&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">       &lt;/plant&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">     &lt;/child&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\">   &lt;/parent&gt;\n</span></span></span><span class=\"line\"><span class=\"cl\"><span class=\"go\"> &lt;/nesting&gt;</span></span></span></code></pre>\n          </td>\n        </tr>\n        \n      </table>\n      \n      \n      <p class=\"next\">\n        Next example: <a href=\"time\" rel=\"next\">Time</a>.\n      </p>\n      \n\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n\n    </div>\n    <script>\n      var codeLines = [];\n      codeLines.push('');codeLines.push('package main\\u000A');codeLines.push('import (\\u000A    \\\"encoding/xml\\\"\\u000A    \\\"fmt\\\"\\u000A)\\u000A');codeLines.push('type Plant struct {\\u000A    XMLName xml.Name `xml:\\\"plant\\\"`\\u000A    Id      int      `xml:\\\"id,attr\\\"`\\u000A    Name    string   `xml:\\\"name\\\"`\\u000A    Origin  []string `xml:\\\"origin\\\"`\\u000A}\\u000A');codeLines.push('func (p Plant) String() string {\\u000A    return fmt.Sprintf(\\\"Plant id\\u003D%v, name\\u003D%v, origin\\u003D%v\\\",\\u000A        p.Id, p.Name, p.Origin)\\u000A}\\u000A');codeLines.push('func main() {\\u000A    coffee :\\u003D \\u0026Plant{Id: 27, Name: \\\"Coffee\\\"}\\u000A    coffee.Origin \\u003D []string{\\\"Ethiopia\\\", \\\"Brazil\\\"}\\u000A');codeLines.push('    out, _ :\\u003D xml.MarshalIndent(coffee, \\\" \\\", \\\"  \\\")\\u000A    fmt.Println(string(out))\\u000A');codeLines.push('    fmt.Println(xml.Header + string(out))\\u000A');codeLines.push('    var p Plant\\u000A    if err :\\u003D xml.Unmarshal(out, \\u0026p); err !\\u003D nil {\\u000A        panic(err)\\u000A    }\\u000A    fmt.Println(p)\\u000A');codeLines.push('    tomato :\\u003D \\u0026Plant{Id: 81, Name: \\\"Tomato\\\"}\\u000A    tomato.Origin \\u003D []string{\\\"Mexico\\\", \\\"California\\\"}\\u000A');codeLines.push('    type Nesting struct {\\u000A        XMLName xml.Name `xml:\\\"nesting\\\"`\\u000A        Plants  []*Plant `xml:\\\"parent\\u003Echild\\u003Eplant\\\"`\\u000A    }\\u000A');codeLines.push('    nesting :\\u003D \\u0026Nesting{}\\u000A    nesting.Plants \\u003D []*Plant{coffee, tomato}\\u000A');codeLines.push('    out, _ \\u003D xml.MarshalIndent(nesting, \\\" \\\", \\\"  \\\")\\u000A    fmt.Println(string(out))\\u000A}\\u000A');codeLines.push('');\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "templates/404.tmpl",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: Not Found</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <body>\n    <div id=\"intro\">\n      <h2><a href=\"./\">Go by Example</a></h2>\n      <p>Sorry, we couldn't find that! Check out the <a href=\"./\">home page</a>?</p>\n{{ template \"footer\" }}\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "templates/example.tmpl",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example: {{.Name}}</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <script>\n      window.onkeydown = (e) => {\n          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n              return;\n          }\n          {{if .PrevExample}}\n          if (e.key == \"ArrowLeft\") {\n              window.location.href = '{{.PrevExample.ID}}';\n          }\n          {{end}}\n          {{if .NextExample}}\n          if (e.key == \"ArrowRight\") {\n              window.location.href = '{{.NextExample.ID}}';\n          }\n          {{end}}\n      }\n  </script>\n  <body>\n    <div class=\"example\" id=\"{{.ID}}\">\n      <h2><a href=\"./\">Go by Example</a>: {{.Name}}</h2>\n      {{range .Segs}}\n      <table>\n        {{range .}}\n        <tr>\n          <td class=\"docs\">\n            {{.DocsRendered}}\n          </td>\n          <td class=\"code{{if .CodeEmpty}} empty{{end}}{{if .CodeLeading}} leading{{end}}\">\n            {{if .CodeRun}}<a href=\"https://go.dev/play/p/{{$.URLHash}}\"><img title=\"Run code\" src=\"play.png\" class=\"run\" /></a><img title=\"Copy code\" src=\"clipboard.png\" class=\"copy\" />{{end}}\n          {{.CodeRendered}}\n          </td>\n        </tr>\n        {{end}}\n      </table>\n      {{end}}\n      {{if .NextExample}}\n      <p class=\"next\">\n        Next example: <a href=\"{{.NextExample.ID}}\" rel=\"next\">{{.NextExample.Name}}</a>.\n      </p>\n      {{end}}\n{{ template \"footer\" }}\n    </div>\n    <script>\n      var codeLines = [];\n      {{range .Segs}}{{range .}}codeLines.push('{{js .CodeForJs}}');{{end}}{{end}}\n    </script>\n    <script src=\"site.js\" async></script>\n  </body>\n</html>\n"
  },
  {
    "path": "templates/footer.tmpl",
    "content": "{{define \"footer\"}}\n    <p class=\"footer\">\n      by <a href=\"https://markmcgranaghan.com\">Mark McGranaghan</a> and <a href=\"https://eli.thegreenplace.net\">Eli Bendersky</a> | <a href=\"https://github.com/mmcgrana/gobyexample\">source</a> | <a href=\"https://github.com/mmcgrana/gobyexample#license\">license</a>\n    </p>\n{{end}}\n"
  },
  {
    "path": "templates/index.tmpl",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Go by Example</title>\n    <link rel=stylesheet href=\"site.css\">\n  </head>\n  <body>\n    <div id=\"intro\">\n      <h2><a href=\"./\">Go by Example</a></h2>\n      <p>\n        <a href=\"https://go.dev\">Go</a> is an\n        open source programming language designed for\n        building scalable, secure and reliable software.\n        Please read the\n        <a href=\"https://go.dev/doc/tutorial/getting-started\">official documentation</a>\n        to learn more.\n      </p>\n\n      <p>\n        <em>Go by Example</em> is a hands-on introduction\n        to Go using annotated example programs. Check out\n        the <a href=\"hello-world\">first example</a> or\n        browse the full list below.\n      </p>\n\n      <p>\n        Unless stated otherwise, examples here assume the\n        <a href=\"https://go.dev/doc/devel/release\">latest major release Go</a>\n        and may use new language features. Try to upgrade to the latest\n        version if something isn't working.\n      </p>\n\n      <ul>\n      {{range .}}\n        <li><a href=\"{{.ID}}\">{{.Name}}</a></li>\n      {{end}}\n      </ul>\n{{ template \"footer\" }}\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "templates/site.css",
    "content": "/* CSS reset: https://meyerweb.com/eric/tools/css/reset/ */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  font-size: 100%;\n  font: inherit;\n  vertical-align: baseline;\n}\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n  display: block;\n}\nbody {\n  line-height: 1;\n}\nol, ul {\n  list-style: none;\n}\nblockquote, q {\n  quotes: none;\n}\nblockquote:before, blockquote:after,\nq:before, q:after {\n  content: '';\n  content: none;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n\n/* Layout and typography */\nbody {\n  font-family: 'Georgia', serif;\n  font-size: 16px;\n  line-height: 20px;\n}\nem {\n  font-style: italic;\n}\nh2 {\n  font-size: 32px;\n  line-height: 40px;\n  margin-top: 40px;\n}\nh2 a {\n  text-decoration: none;\n}\ndiv.example {\n  width: 995px;\n  max-width: calc(100% - 24px);\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 120px;\n}\ndiv.example table {\n  margin-top: 15px;\n  margin-bottom: 20px;\n}\np.next {\n  margin-bottom: 20px;\n}\np.footer {\n  font-size: 75%;\n}\ndiv#intro {\n  width: 420px;\n  min-width: 420px;\n  max-width: 420px;\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 120px;\n}\ndiv#intro p {\n  padding-top: 20px;\n}\ndiv#intro ul {\n  padding-top: 20px;\n}\ntable td {\n  border: 0;\n  outline: 0;\n}\ntd.docs {\n  width: 420px;\n  max-width: 420px;\n  min-width: 420px;\n  min-height: 5px;\n  vertical-align: top;\n  text-align: left;\n}\ntd.docs p {\n  padding-right: 5px;\n  padding-top: 5px;\n  padding-bottom: 15px;\n}\ntd.code {\n  width: 575px;\n  max-width: 575px;\n  min-width: 575px;\n  padding-top: 5px;\n  padding-right: 5px;\n  padding-left: 5px;\n  padding-bottom: 5px;\n  vertical-align: top;\n}\ntd.code.leading {\n  padding-bottom: 11px;\n}\npre, code {\n  font-size: 14px; line-height: 18px;\n  font-family: 'Menlo', 'Monaco', 'Consolas', 'Lucida Console', monospace;\n}\nimg.copy, img.run {\n  height: 16px;\n  width: 16px;\n  float: right\n}\nimg.copy, img.run {\n  cursor: pointer;\n}\nimg.copy {\n  margin-right: 4px;\n}\n\n\n/* Colors: light mode */\nbody {\n  background-color: #ffffff;\n  color: #252519;\n}\ntd.code.empty {\n  background: #ffffff;\n}\na, a:visited {\n  color: #261a3b;\n}\np.footer {\n  color: #808080;\n}\np.footer a, p.footer a:visited {\n  color: #808080;\n}\ntd.code {\n  background: #f0f0f0;\n}\n\n/* Syntax highlighting: light mode */\nbody .nx { }                 /* Name.Other: package, variable, struct, param, generic type names, etc. */\nbody .nf { }                 /* Name.Function: function names (def and call) */\nbody .o  { }                 /* Operator: :=, &, *, +, &&, <, etc. */\nbody .p  { }                 /* Plain: = , . : [ ( { etc. */\nbody .k  { color: #954121 }  /* Keyword: if, for, range, return, defer, etc.  */\nbody .kc { color: #954121 }  /* Keyword.Constant: nil, true, false */\nbody .kd { color: #954121 }  /* Keyword.Declaration: func, var, type, struct, map, chan, etc. */\nbody .kn { color: #954121 }  /* Keyword.Namespace: package, import */\nbody .nb { color: #954121 }  /* Name.Builtin: make, len, delete, append, etc. */\nbody .kt { color: #b00040 }  /* Keyword.Type: string, int, byte, error, etc. */\nbody .m  { color: #666666 }  /* Literal.Number */\nbody .mf { color: #666666 }  /* Literal.Number.Float */\nbody .mh { color: #666666 }  /* Literal.Number.Hex */\nbody .mi { color: #666666 }  /* Literal.Number.Integer */\nbody .mo { color: #666666 }  /* Literal.Number.Oct */\nbody .s  { color: #219161 }  /* Literal.String */\nbody .sc { color: #219161 }  /* Literal.String.Char */\nbody .gp { color: #000080 }  /* Generic.Prompt: shell prompt */\nbody .go { color: #808080 }  /* Generic.Output: shell output */\nbody .c1 { color: #808080 }  /* Comment.Single */\n\n\n@media (prefers-color-scheme: dark) {\n  /* Colors: dark mode */\n  body {\n    background-color: #1f1f1f;\n    color: #dadada;\n  }\n  td.code.empty {\n    background: #1f1f1f;\n  }\n  a, a:visited {\n    color: #e4e4e4;\n  }\n  p.footer {\n    color: #898e98;\n  }\n  p.footer a, p.footer a:visited {\n    color: #898e98;\n  }\n  td.code {\n    background: #282828;\n  }\n\n \n  /* Syntax highlighting: dark mode */\n  body .nx { }                 /* Name.Other */\n  body .nf { }                 /* Name.Function */\n  body .o  { }                 /* Operator */\n  body .p  { }                 /* Plain */\n  body .k  { color: #af5a54 }  /* Keyword */\n  body .kc { color: #af5a54 }  /* Keyword.Constant */\n  body .kd { color: #af5a54 }  /* Keyword.Declaration */\n  body .kn { color: #af5a54 }  /* Keyword.Namespace */\n  body .nb { color: #af5a54 }  /* Name.Builtin */\n  body .kt { color: #b64343 }  /* Keyword.Type */\n  body .m  { color: #688ec8 }  /* Literal.Number */\n  body .mf { color: #688ec8 }  /* Literal.Number.Float */\n  body .mh { color: #688ec8 }  /* Literal.Number.Hex */\n  body .mi { color: #688ec8 }  /* Literal.Number.Integer */\n  body .mo { color: #688ec8 }  /* Literal.Number.Oct */\n  body .s  { color: #718e72 }  /* Literal.String */\n  body .sc { color: #718e72 }  /* Literal.String.Char */\n  body .gp { color: #8a6ab1 }  /* Generic.Prompt */\n  body .go { color: #868686 }  /* Generic.Output */\n  body .c1 { color: #868686 }  /* Comment.Single */\n}\n"
  },
  {
    "path": "templates/site.js",
    "content": "/*!\r\n * clipboard.js v1.5.13\r\n * https://zenorocha.github.io/clipboard.js\r\n *\r\n * Licensed MIT © Zeno Rocha\r\n */\r\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var e;e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function r(c,a){if(!n[c]){if(!e[c]){var l=\"function\"==typeof require&&require;if(!a&&l)return l(c,!0);if(i)return i(c,!0);var s=new Error(\"Cannot find module '\"+c+\"'\");throw s.code=\"MODULE_NOT_FOUND\",s}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return r(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var i=\"function\"==typeof require&&require,c=0;c<o.length;c++)r(o[c]);return r}({1:[function(t,e,n){function o(t,e,n){for(n=n||document.documentElement;t&&t!==n;){if(r(t,e))return t;t=t.parentNode}return r(t,e)?t:null}try{var r=t(\"matches-selector\")}catch(e){var r=t(\"component-matches-selector\")}e.exports=o},{\"component-matches-selector\":2,\"matches-selector\":2}],2:[function(t,e,n){function o(t,e){if(!t||1!==t.nodeType)return!1;if(c)return c.call(t,e);for(var n=r.all(e,t.parentNode),o=0;o<n.length;++o)if(n[o]==t)return!0;return!1}try{var r=t(\"query\")}catch(e){var r=t(\"component-query\")}var i=Element.prototype,c=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector;e.exports=o},{\"component-query\":3,query:3}],3:[function(t,e,n){function o(t,e){return e.querySelector(t)}n=e.exports=function(t,e){return e=e||document,o(t,e)},n.all=function(t,e){return e=e||document,e.querySelectorAll(t)},n.engine=function(t){if(!t.one)throw new Error(\".one callback required\");if(!t.all)throw new Error(\".all callback required\");return o=t.one,n.all=t.all,n}},{}],4:[function(t,e,n){function o(t,e,n,o,i){var c=r.apply(this,arguments);return t.addEventListener(n,c,i),{destroy:function(){t.removeEventListener(n,c,i)}}}function r(t,e,n,o){return function(n){n.delegateTarget=i(n.target,e,!0),n.delegateTarget&&o.call(t,n)}}var i=t(\"component-closest\");e.exports=o},{\"component-closest\":1}],5:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&(\"[object NodeList]\"===e||\"[object HTMLCollection]\"===e)&&\"length\"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return\"string\"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return\"[object Function]\"===e}},{}],6:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error(\"Missing required arguments\");if(!a.string(e))throw new TypeError(\"Second argument must be a String\");if(!a.fn(n))throw new TypeError(\"Third argument must be a Function\");if(a.node(t))return r(t,e,n);if(a.nodeList(t))return i(t,e,n);if(a.string(t))return c(t,e,n);throw new TypeError(\"First argument must be a String, HTMLElement, HTMLCollection, or NodeList\")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function c(t,e,n){return l(document.body,t,e,n)}var a=t(\"./is\"),l=t(\"delegate\");e.exports=o},{\"./is\":5,delegate:4}],7:[function(t,e,n){function o(t){var e;if(\"SELECT\"===t.nodeName)t.focus(),e=t.value;else if(\"INPUT\"===t.nodeName||\"TEXTAREA\"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute(\"contenteditable\")&&t.focus();var n=window.getSelection(),o=document.createRange();o.selectNodeContents(t),n.removeAllRanges(),n.addRange(o),e=n.toString()}return e}e.exports=o},{}],8:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,c=o.length;i<c;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},e.exports=o},{}],9:[function(e,n,o){!function(r,i){if(\"function\"==typeof t&&t.amd)t([\"module\",\"select\"],i);else if(\"undefined\"!=typeof o)i(n,e(\"select\"));else{var c={exports:{}};i(c,r.select),r.clipboardAction=c.exports}}(this,function(t,e){\"use strict\";function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}var r=n(e),i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol?\"symbol\":typeof t},c=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),a=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=\"\"},t.prototype.initSelection=function t(){this.text?this.selectFake():this.target&&this.selectTarget()},t.prototype.selectFake=function t(){var e=this,n=\"rtl\"==document.documentElement.getAttribute(\"dir\");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=document.body.addEventListener(\"click\",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement(\"textarea\"),this.fakeElem.style.fontSize=\"12pt\",this.fakeElem.style.border=\"0\",this.fakeElem.style.padding=\"0\",this.fakeElem.style.margin=\"0\",this.fakeElem.style.position=\"absolute\",this.fakeElem.style[n?\"right\":\"left\"]=\"-9999px\";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.addEventListener(\"focus\",window.scrollTo(0,o)),this.fakeElem.style.top=o+\"px\",this.fakeElem.setAttribute(\"readonly\",\"\"),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()},t.prototype.removeFake=function t(){this.fakeHandler&&(document.body.removeEventListener(\"click\",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function t(){this.selectedText=(0,r.default)(this.target),this.copyText()},t.prototype.copyText=function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)},t.prototype.handleResult=function t(e){this.emitter.emit(e?\"success\":\"error\",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function t(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function t(){this.removeFake()},c(t,[{key:\"action\",set:function t(){var e=arguments.length<=0||void 0===arguments[0]?\"copy\":arguments[0];if(this._action=e,\"copy\"!==this._action&&\"cut\"!==this._action)throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"')},get:function t(){return this._action}},{key:\"target\",set:function t(e){if(void 0!==e){if(!e||\"object\"!==(\"undefined\"==typeof e?\"undefined\":i(e))||1!==e.nodeType)throw new Error('Invalid \"target\" value, use a valid Element');if(\"copy\"===this.action&&e.hasAttribute(\"disabled\"))throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');if(\"cut\"===this.action&&(e.hasAttribute(\"readonly\")||e.hasAttribute(\"disabled\")))throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=a})},{select:7}],10:[function(e,n,o){!function(r,i){if(\"function\"==typeof t&&t.amd)t([\"module\",\"./clipboard-action\",\"tiny-emitter\",\"good-listener\"],i);else if(\"undefined\"!=typeof o)i(n,e(\"./clipboard-action\"),e(\"tiny-emitter\"),e(\"good-listener\"));else{var c={exports:{}};i(c,r.clipboardAction,r.tinyEmitter,r.goodListener),r.clipboard=c.exports}}(this,function(t,e,n,o){\"use strict\";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function c(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!=typeof e&&\"function\"!=typeof e?t:e}function a(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n=\"data-clipboard-\"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=r(e),u=r(n),f=r(o),d=function(t){function e(n,o){i(this,e);var r=c(this,t.call(this));return r.resolveOptions(o),r.listenClick(n),r}return a(e,t),e.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=\"function\"==typeof e.action?e.action:this.defaultAction,this.target=\"function\"==typeof e.target?e.target:this.defaultTarget,this.text=\"function\"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function t(e){var n=this;this.listener=(0,f.default)(e,\"click\",function(t){return n.onClick(t)})},e.prototype.onClick=function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function t(e){return l(\"action\",e)},e.prototype.defaultTarget=function t(e){var n=l(\"target\",e);if(n)return document.querySelector(n)},e.prototype.defaultText=function t(e){return l(\"text\",e)},e.prototype.destroy=function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(u.default);t.exports=d})},{\"./clipboard-action\":9,\"good-listener\":6,\"tiny-emitter\":8}]},{},[10])(10)});\r\n\r\n/*\r\n* code for the clipboard functionality\r\n*/\r\n\r\nvar clipboard = new Clipboard('.copy', {\r\n    text: function(trigger) {\r\n        return codeLines.filter(function(cL) { return cL != '' }).join(\"\\n\").replace(/\\n$/, '');\r\n    }\r\n});\r\n"
  },
  {
    "path": "tools/build",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nverbose() {\n\t! test -z \"$VERBOSE\"\n}\n\nverbose && echo \"Running tests...\"\ntools/test\n\nverbose && echo \"Formatting code...\"\ntools/format\n\nverbose && echo \"Measuring line lengths...\"\ntools/measure\n\n# SITE_DIR is the final location where we want generated content to be\nSITE_DIR=\"public\"\n\n# GENERATE_DIR is where the content will be generated initially\nGENERATE_DIR=\"$(mktemp -d)\"\n\nfunction cleanup() {\n  rm -rf \"$GENERATE_DIR\"\n}\ntrap cleanup EXIT\n\nverbose && echo \"Generating HTML to $GENERATE_DIR...\"\ntools/generate $GENERATE_DIR\n\n# In TESTING mode, make sure that the generated content is identical to\n# what's already in SITE_DIR. If a difference is found, this script exits\n# with an error.\nif [[ ! -z \"$TESTING\" ]]; then\n\techo \"Comparing $GENERATE_DIR with $SITE_DIR...\"\n\tdiff -r \"$GENERATE_DIR\" \"$SITE_DIR\"\nfi\n\nverbose && echo \"Copying $GENERATE_DIR to $SITE_DIR\"\ncp -rf \"${GENERATE_DIR}/.\" \"$SITE_DIR\"\n"
  },
  {
    "path": "tools/build-loop",
    "content": "#!/usr/bin/env bash\n\nTRAPPING=0\ntrap \"{ echo finishing; TRAPPING=1; }\" SIGINT\n\nwhile :\ndo\n  tools/build\n  RET=$?\n  if [ $RET -eq 0 ]; then\n    echo \"success\"\n  else\n    echo \"error: $RET\"\n  fi\n  if [ $TRAPPING -eq 0 ]; then\n    sleep 1\n  else\n    echo \"done\"\n    exit 0\n  fi\ndone\n"
  },
  {
    "path": "tools/format",
    "content": "#!/usr/bin/env bash\n\nset -eo pipefail\n\npaths=$(ls examples/*/*.go)\n\nfor path in $paths; do\n  gofmt -w=true $path\ndone\n"
  },
  {
    "path": "tools/generate",
    "content": "#!/usr/bin/env bash\n\nexec go run tools/generate.go $@\n"
  },
  {
    "path": "tools/generate.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha1\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"text/template\"\n\n\t\"github.com/alecthomas/chroma/v2\"\n\t\"github.com/alecthomas/chroma/v2/formatters/html\"\n\t\"github.com/alecthomas/chroma/v2/lexers\"\n\t\"github.com/alecthomas/chroma/v2/styles\"\n\n\t\"github.com/russross/blackfriday/v2\"\n)\n\n// siteDir is the target directory into which the HTML gets generated. Its\n// default is set here but can be changed by an argument passed into the\n// program.\nvar siteDir = \"./public\"\n\nfunc verbose() bool {\n\treturn len(os.Getenv(\"VERBOSE\")) > 0\n}\n\nfunc check(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc isDir(path string) bool {\n\tfileStat, _ := os.Stat(path)\n\treturn fileStat.IsDir()\n}\n\nfunc ensureDir(dir string) {\n\terr := os.MkdirAll(dir, 0755)\n\tcheck(err)\n}\n\nfunc copyFile(src, dst string) {\n\tdat, err := os.ReadFile(src)\n\tcheck(err)\n\terr = os.WriteFile(dst, dat, 0644)\n\tcheck(err)\n}\n\nfunc sha1Sum(s string) string {\n\th := sha1.New()\n\th.Write([]byte(s))\n\tb := h.Sum(nil)\n\treturn fmt.Sprintf(\"%x\", b)\n}\n\nfunc mustReadFile(path string) string {\n\tbytes, err := os.ReadFile(path)\n\tcheck(err)\n\treturn string(bytes)\n}\n\nfunc markdown(src string) string {\n\treturn string(blackfriday.Run([]byte(src)))\n}\n\nfunc readLines(path string) []string {\n\tsrc := mustReadFile(path)\n\treturn strings.Split(src, \"\\n\")\n}\n\nfunc mustGlob(glob string) []string {\n\tpaths, err := filepath.Glob(glob)\n\tcheck(err)\n\treturn paths\n}\n\nfunc whichLexer(path string) string {\n\tif strings.HasSuffix(path, \".go\") {\n\t\treturn \"go\"\n\t} else if strings.HasSuffix(path, \".sh\") {\n\t\treturn \"console\"\n\t}\n\tpanic(\"No lexer for \" + path)\n}\n\nfunc debug(msg string) {\n\tif os.Getenv(\"DEBUG\") == \"1\" {\n\t\tfmt.Fprintln(os.Stderr, msg)\n\t}\n}\n\nvar docsPat = regexp.MustCompile(`^(\\s*(\\/\\/|#)\\s|\\s*\\/\\/$)`)\nvar dashPat = regexp.MustCompile(`\\-+`)\n\n// Seg is a segment of an example\ntype Seg struct {\n\tDocs, DocsRendered              string\n\tCode, CodeRendered, CodeForJs   string\n\tCodeEmpty, CodeLeading, CodeRun bool\n}\n\n// Example is info extracted from an example file\ntype Example struct {\n\tID, Name                    string\n\tGoCode, GoCodeHash, URLHash string\n\tSegs                        [][]*Seg\n\tPrevExample                 *Example\n\tNextExample                 *Example\n}\n\nfunc parseHashFile(sourcePath string) (string, string) {\n\tlines := readLines(sourcePath)\n\treturn lines[0], lines[1]\n}\n\nfunc resetURLHashFile(codehash, code, sourcePath string) string {\n\tif verbose() {\n\t\tfmt.Println(\"  Sending request to play.golang.org\")\n\t}\n\tpayload := strings.NewReader(code)\n\tresp, err := http.Post(\"https://play.golang.org/share\", \"text/plain\", payload)\n\tcheck(err)\n\tdefer resp.Body.Close()\n\tbody, err := io.ReadAll(resp.Body)\n\tcheck(err)\n\turlkey := string(body)\n\tdata := fmt.Sprintf(\"%s\\n%s\\n\", codehash, urlkey)\n\tos.WriteFile(sourcePath, []byte(data), 0644)\n\treturn urlkey\n}\n\nfunc parseSegs(sourcePath string) ([]*Seg, string) {\n\tvar (\n\t\tlines  []string\n\t\tsource []string\n\t)\n\t// Convert tabs to spaces for uniform rendering.\n\tfor _, line := range readLines(sourcePath) {\n\t\tlines = append(lines, strings.Replace(line, \"\\t\", \"    \", -1))\n\t\tsource = append(source, line)\n\t}\n\tsegs := []*Seg{}\n\tlastSeen := \"\"\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tlastSeen = \"\"\n\t\t\tcontinue\n\t\t}\n\t\tmatchDocs := docsPat.MatchString(line)\n\t\tmatchCode := !matchDocs\n\t\tnewDocs := (lastSeen == \"\") || ((lastSeen != \"docs\") && (segs[len(segs)-1].Docs != \"\"))\n\t\tnewCode := (lastSeen == \"\") || ((lastSeen != \"code\") && (segs[len(segs)-1].Code != \"\"))\n\t\tif newDocs || newCode {\n\t\t\tdebug(\"NEWSEG\")\n\t\t}\n\t\tif matchDocs {\n\t\t\ttrimmed := docsPat.ReplaceAllString(line, \"\")\n\t\t\tif newDocs {\n\t\t\t\tnewSeg := Seg{Docs: trimmed, Code: \"\"}\n\t\t\t\tsegs = append(segs, &newSeg)\n\t\t\t} else {\n\t\t\t\tsegs[len(segs)-1].Docs = segs[len(segs)-1].Docs + \"\\n\" + trimmed\n\t\t\t}\n\t\t\tdebug(\"DOCS: \" + line)\n\t\t\tlastSeen = \"docs\"\n\t\t} else if matchCode {\n\t\t\tif newCode {\n\t\t\t\tnewSeg := Seg{Docs: \"\", Code: line}\n\t\t\t\tsegs = append(segs, &newSeg)\n\t\t\t} else {\n\t\t\t\tlastSeg := segs[len(segs)-1]\n\t\t\t\tif len(lastSeg.Code) == 0 {\n\t\t\t\t\tlastSeg.Code = line\n\t\t\t\t} else {\n\t\t\t\t\tlastSeg.Code = lastSeg.Code + \"\\n\" + line\n\t\t\t\t}\n\t\t\t}\n\t\t\tdebug(\"CODE: \" + line)\n\t\t\tlastSeen = \"code\"\n\t\t}\n\t}\n\tfor i, seg := range segs {\n\t\tseg.CodeEmpty = (seg.Code == \"\")\n\t\tseg.CodeLeading = (i < (len(segs) - 1))\n\t\tseg.CodeRun = strings.Contains(seg.Code, \"package main\")\n\t}\n\treturn segs, strings.Join(source, \"\\n\")\n}\n\nfunc chromaFormat(code, filePath string) string {\n\tlexer := lexers.Get(filePath)\n\tif lexer == nil {\n\t\tlexer = lexers.Fallback\n\t}\n\n\tif strings.HasSuffix(filePath, \".sh\") {\n\t\tlexer = SimpleShellOutputLexer\n\t}\n\n\tlexer = chroma.Coalesce(lexer)\n\n\tstyle := styles.Get(\"swapoff\")\n\tif style == nil {\n\t\tstyle = styles.Fallback\n\t}\n\tformatter := html.New(html.WithClasses(true))\n\titerator, err := lexer.Tokenise(nil, string(code))\n\tcheck(err)\n\tbuf := new(bytes.Buffer)\n\terr = formatter.Format(buf, style, iterator)\n\tcheck(err)\n\treturn buf.String()\n}\n\nfunc parseAndRenderSegs(sourcePath string) ([]*Seg, string) {\n\tsegs, filecontent := parseSegs(sourcePath)\n\tlexer := whichLexer(sourcePath)\n\tfor _, seg := range segs {\n\t\tif seg.Docs != \"\" {\n\t\t\tseg.DocsRendered = markdown(seg.Docs)\n\t\t}\n\t\tif seg.Code != \"\" {\n\t\t\tseg.CodeRendered = chromaFormat(seg.Code, sourcePath)\n\n\t\t\t// adding the content to the js code for copying to the clipboard\n\t\t\tif strings.HasSuffix(sourcePath, \".go\") {\n\t\t\t\tseg.CodeForJs = strings.Trim(seg.Code, \"\\n\") + \"\\n\"\n\t\t\t}\n\t\t}\n\t}\n\t// we are only interested in the 'go' code to pass to play.golang.org\n\tif lexer != \"go\" {\n\t\tfilecontent = \"\"\n\t}\n\treturn segs, filecontent\n}\n\nfunc parseExamples() []*Example {\n\tvar exampleNames []string\n\tfor _, line := range readLines(\"examples.txt\") {\n\t\tif line != \"\" && !strings.HasPrefix(line, \"#\") {\n\t\t\texampleNames = append(exampleNames, line)\n\t\t}\n\t}\n\texamples := make([]*Example, 0)\n\tfor i, exampleName := range exampleNames {\n\t\tif verbose() {\n\t\t\tfmt.Printf(\"Processing %s [%d/%d]\\n\", exampleName, i+1, len(exampleNames))\n\t\t}\n\t\texample := Example{Name: exampleName}\n\t\texampleID := strings.ToLower(exampleName)\n\t\texampleID = strings.Replace(exampleID, \" \", \"-\", -1)\n\t\texampleID = strings.Replace(exampleID, \"/\", \"-\", -1)\n\t\texampleID = strings.Replace(exampleID, \"'\", \"\", -1)\n\t\texampleID = dashPat.ReplaceAllString(exampleID, \"-\")\n\t\texample.ID = exampleID\n\t\texample.Segs = make([][]*Seg, 0)\n\t\tsourcePaths := mustGlob(\"examples/\" + exampleID + \"/*\")\n\t\tfor _, sourcePath := range sourcePaths {\n\t\t\tif !isDir(sourcePath) {\n\t\t\t\tif strings.HasSuffix(sourcePath, \".hash\") {\n\t\t\t\t\texample.GoCodeHash, example.URLHash = parseHashFile(sourcePath)\n\t\t\t\t} else {\n\t\t\t\t\tsourceSegs, filecontents := parseAndRenderSegs(sourcePath)\n\t\t\t\t\tif filecontents != \"\" {\n\t\t\t\t\t\texample.GoCode = filecontents\n\t\t\t\t\t}\n\t\t\t\t\texample.Segs = append(example.Segs, sourceSegs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tnewCodeHash := sha1Sum(example.GoCode)\n\t\tif example.GoCodeHash != newCodeHash {\n\t\t\texample.URLHash = resetURLHashFile(newCodeHash, example.GoCode, \"examples/\"+example.ID+\"/\"+example.ID+\".hash\")\n\t\t}\n\t\texamples = append(examples, &example)\n\t}\n\tfor i, example := range examples {\n\t\tif i > 0 {\n\t\t\texample.PrevExample = examples[i-1]\n\t\t}\n\t\tif i < (len(examples) - 1) {\n\t\t\texample.NextExample = examples[i+1]\n\t\t}\n\t}\n\treturn examples\n}\n\nfunc renderIndex(examples []*Example) {\n\tif verbose() {\n\t\tfmt.Println(\"Rendering index\")\n\t}\n\tindexTmpl := template.New(\"index\")\n\ttemplate.Must(indexTmpl.Parse(mustReadFile(\"templates/footer.tmpl\")))\n\ttemplate.Must(indexTmpl.Parse(mustReadFile(\"templates/index.tmpl\")))\n\tindexF, err := os.Create(siteDir + \"/index.html\")\n\tcheck(err)\n\tdefer indexF.Close()\n\tcheck(indexTmpl.Execute(indexF, examples))\n}\n\nfunc renderExamples(examples []*Example) {\n\tif verbose() {\n\t\tfmt.Println(\"Rendering examples\")\n\t}\n\texampleTmpl := template.New(\"example\")\n\ttemplate.Must(exampleTmpl.Parse(mustReadFile(\"templates/footer.tmpl\")))\n\ttemplate.Must(exampleTmpl.Parse(mustReadFile(\"templates/example.tmpl\")))\n\tfor _, example := range examples {\n\t\texampleF, err := os.Create(siteDir + \"/\" + example.ID)\n\t\tcheck(err)\n\t\tdefer exampleF.Close()\n\t\tcheck(exampleTmpl.Execute(exampleF, example))\n\t}\n}\n\nfunc render404() {\n\tif verbose() {\n\t\tfmt.Println(\"Rendering 404\")\n\t}\n\ttmpl := template.New(\"404\")\n\ttemplate.Must(tmpl.Parse(mustReadFile(\"templates/footer.tmpl\")))\n\ttemplate.Must(tmpl.Parse(mustReadFile(\"templates/404.tmpl\")))\n\tfile, err := os.Create(siteDir + \"/404.html\")\n\tcheck(err)\n\tdefer file.Close()\n\tcheck(tmpl.Execute(file, \"\"))\n}\n\nfunc main() {\n\tif len(os.Args) > 1 {\n\t\tsiteDir = os.Args[1]\n\t}\n\tensureDir(siteDir)\n\n\tcopyFile(\"templates/site.css\", siteDir+\"/site.css\")\n\tcopyFile(\"templates/site.js\", siteDir+\"/site.js\")\n\tcopyFile(\"templates/favicon.ico\", siteDir+\"/favicon.ico\")\n\tcopyFile(\"templates/play.png\", siteDir+\"/play.png\")\n\tcopyFile(\"templates/clipboard.png\", siteDir+\"/clipboard.png\")\n\texamples := parseExamples()\n\trenderIndex(examples)\n\trenderExamples(examples)\n\trender404()\n}\n\nvar SimpleShellOutputLexer = chroma.MustNewLexer(\n\t&chroma.Config{\n\t\tName:      \"Shell Output\",\n\t\tAliases:   []string{\"console\"},\n\t\tFilenames: []string{\"*.sh\"},\n\t\tMimeTypes: []string{},\n\t},\n\tfunc() chroma.Rules {\n\t\treturn chroma.Rules{\n\t\t\t\"root\": {\n\t\t\t\t// $ or > triggers the start of prompt formatting\n\t\t\t\t{`^\\$`, chroma.GenericPrompt, chroma.Push(\"prompt\")},\n\t\t\t\t{`^>`, chroma.GenericPrompt, chroma.Push(\"prompt\")},\n\n\t\t\t\t// empty lines are just text\n\t\t\t\t{`^$\\n`, chroma.Text, nil},\n\n\t\t\t\t// otherwise its all output\n\t\t\t\t{`[^\\n]+$\\n?`, chroma.GenericOutput, nil},\n\t\t\t},\n\t\t\t\"prompt\": {\n\t\t\t\t// when we find newline, do output formatting rules\n\t\t\t\t{`\\n`, chroma.Text, chroma.Push(\"output\")},\n\t\t\t\t// otherwise its all text\n\t\t\t\t{`[^\\n]+$`, chroma.Text, nil},\n\t\t\t},\n\t\t\t\"output\": {\n\t\t\t\t// sometimes there isn't output so we go right back to prompt\n\t\t\t\t{`^\\$`, chroma.GenericPrompt, chroma.Pop(1)},\n\t\t\t\t{`^>`, chroma.GenericPrompt, chroma.Pop(1)},\n\t\t\t\t// otherwise its all output\n\t\t\t\t{`[^\\n]+$\\n?`, chroma.GenericOutput, nil},\n\t\t\t},\n\t\t}\n\t},\n)\n"
  },
  {
    "path": "tools/measure",
    "content": "#!/usr/bin/env bash\n\nexec go run tools/measure.go\n"
  },
  {
    "path": "tools/measure.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\nfunc check(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc readLines(path string) []string {\n\tsrcBytes, err := os.ReadFile(path)\n\tcheck(err)\n\treturn strings.Split(string(srcBytes), \"\\n\")\n}\n\nfunc isDir(path string) bool {\n\tfileStat, _ := os.Stat(path)\n\treturn fileStat.IsDir()\n}\n\nvar commentPat = regexp.MustCompile(\"\\\\s*\\\\/\\\\/\")\n\nfunc main() {\n\tsourcePaths, err := filepath.Glob(\"./examples/*/*\")\n\tcheck(err)\n\tfoundLongFile := false\n\tfor _, sourcePath := range sourcePaths {\n\t\tfoundLongLine := false\n\t\tif !isDir(sourcePath) {\n\t\t\tlines := readLines(sourcePath)\n\t\t\tfor i, line := range lines {\n\t\t\t\t// Convert tabs to spaces before measuring, so we get an accurate measure\n\t\t\t\t// of how long the output will end up being.\n\t\t\t\tline := strings.Replace(line, \"\\t\", \"    \", -1)\n\t\t\t\tif !foundLongLine && !commentPat.MatchString(line) && (utf8.RuneCountInString(line) > 68) {\n\t\t\t\t\tfmt.Printf(\"measure: %s:%d (rune count = %d)\\n\", sourcePath, i+1, utf8.RuneCountInString(line))\n\t\t\t\t\tfoundLongLine = true\n\t\t\t\t\tfoundLongFile = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif foundLongFile {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "tools/serve",
    "content": "#!/usr/bin/env bash\n\nexec go run tools/serve.go\n"
  },
  {
    "path": "tools/serve.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n)\n\nfunc main() {\n\tport := \"8000\"\n\tpublicDir := \"public\"\n\tfmt.Printf(\"Serving Go by Example at http://127.0.0.1:%s\\n\", port)\n\thttp.ListenAndServe(\":\"+port, http.FileServer(http.Dir(publicDir)))\n}\n"
  },
  {
    "path": "tools/test",
    "content": "#!/usr/bin/env bash\n\n# Sanity testing of the examples.\n\nset -eo pipefail\n\n# go vet will attempt to build each example, making sure it compiles. It will\n# also report known issues with the code. Disabling the -unreachable check\n# because it will fire false positives for some examples demonstrating panics.\ngo vet -unreachable=false ./examples/...\n"
  },
  {
    "path": "tools/upload",
    "content": "#!/usr/bin/env bash\n\nexec go run tools/upload.go -region us-east-1 -bucket gobyexample.com\n"
  },
  {
    "path": "tools/upload.go",
    "content": "// Uploads the generated site from the public/ directory to the S3 bucket from\n// which it's served.\n// To invoke this program, the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY\n// env vars have to be set appropriately, and the -region and -bucket flags\n// have to be passed in.\npackage main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n)\n\n// guessContentType guesses the HTTP content type appropriate for the given\n// filename.\nfunc guessContentType(filename string) string {\n\tswitch filepath.Ext(filename) {\n\tcase \".ico\":\n\t\treturn \"image/x-icon\"\n\tcase \".png\":\n\t\treturn \"image/png\"\n\tcase \".css\":\n\t\treturn \"text/css\"\n\tdefault:\n\t\treturn \"text/html\"\n\t}\n}\n\nfunc main() {\n\tregion := flag.String(\"region\", \"\", \"S3 region\")\n\tbucket := flag.String(\"bucket\", \"\", \"S3 bucket name\")\n\tflag.Parse()\n\n\tif len(*region) == 0 || len(*bucket) == 0 {\n\t\tlog.Fatalf(\"region and bucket must be specified [region=%s, bucket=%s]\", *region, *bucket)\n\t}\n\n\tcfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(*region))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tclient := s3.NewFromConfig(cfg)\n\n\t// The whole contents of the public/ directory are uploaded. This code assumes\n\t// the directory structure is flat - there are no subdirectories.\n\tpublicDir := \"./public/\"\n\tc, err := os.ReadDir(publicDir)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tfor _, entry := range c {\n\t\tif !entry.IsDir() {\n\t\t\tfile, err := os.Open(filepath.Join(publicDir, entry.Name()))\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tdefer file.Close()\n\n\t\t\tcontentType := guessContentType(entry.Name())\n\t\t\tlog.Printf(\"Uploading %s (%s)\", entry.Name(), contentType)\n\n\t\t\tcfg := &s3.PutObjectInput{\n\t\t\t\tBucket:      bucket,\n\t\t\t\tKey:         aws.String(entry.Name()),\n\t\t\t\tBody:        file,\n\t\t\t\tContentType: aws.String(contentType),\n\t\t\t}\n\n\t\t\t_, err = client.PutObject(context.TODO(), cfg)\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  }
]