From 0c18c9689a4330d907621c53708d7e9f45dcd244 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Wed, 11 Sep 2013 08:40:30 -0700 Subject: [PATCH 01/10] initial changes to generate play buttons, ref #37 --- server.go | 1 + templates/example.tmpl | 1 + templates/play.png | Bin 0 -> 30822 bytes tools/generate.go | 80 ++++++++++++++++++++++++++++++++--------- 4 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 templates/play.png diff --git a/server.go b/server.go index 4b7164c..fc420c8 100644 --- a/server.go +++ b/server.go @@ -142,6 +142,7 @@ func router() *mux.Router { router := mux.NewRouter() router.HandleFunc("/", static).Methods("GET") router.HandleFunc("/favicon.ico", static).Methods("GET") + router.HandleFunc("/play.png", static).Methods("GET") router.HandleFunc("/site.css", static).Methods("GET") entries, err := ioutil.ReadDir("public") check(err) diff --git a/templates/example.tmpl b/templates/example.tmpl index 3ad84f3..66dc55d 100644 --- a/templates/example.tmpl +++ b/templates/example.tmpl @@ -20,6 +20,7 @@

Go by Example: {{.Name}}

+ {{range .Segs}} {{range .}} diff --git a/templates/play.png b/templates/play.png new file mode 100644 index 0000000000000000000000000000000000000000..b450204efaa361506629a5d162f57b36575e0b39 GIT binary patch literal 30822 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 OhLDj^6t5OF4*DM{V>7G( literal 0 HcmV?d00001 diff --git a/tools/generate.go b/tools/generate.go index 3aceaa3..1286bb5 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/russross/blackfriday" "io/ioutil" + "net/http" "os" "os/exec" "path/filepath" @@ -123,13 +124,43 @@ type Seg struct { } type Example struct { - Id, Name string - Segs [][]*Seg - NextExample *Example + Id, Name string + GoCode, GoCodeHash, UrlHash string + Segs [][]*Seg + NextExample *Example } -func parseSegs(sourcePath string) []*Seg { +func parseHashFile(sourcePath string) (string, string) { + var codehash,urlkey string lines := readLines(sourcePath) + for idx,line := range lines { + switch idx { + case 0: + codehash = line + case 1: + urlkey = line + } + } + return codehash,urlkey +} + +func resetUrlHashFile(codehash, code, sourcePath string) string { + payload := strings.NewReader(code) + resp, err := http.Post("http://play.golang.org/share", "text/plain", payload) + if err != nil { + // handle error + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + urlkey := string(body) + data := fmt.Sprintf("%s\n%s",codehash,urlkey) + ioutil.WriteFile(sourcePath,[]byte(data),0644) + return urlkey +} + +func parseSegs(sourcePath string) ([]*Seg, string) { + lines := readLines(sourcePath) + filecontent := strings.Join(lines, "\n") segs := []*Seg{} lastSeen := "" for _, line := range lines { @@ -172,21 +203,25 @@ func parseSegs(sourcePath string) []*Seg { seg.CodeEmpty = (seg.Code == "") seg.CodeLeading = (i < (len(segs) - 1)) } - return segs + return segs,filecontent } -func parseAndRenderSegs(sourcePath string) []*Seg { - segs := parseSegs(sourcePath) +func parseAndRenderSegs(sourcePath string) ([]*Seg, string) { + segs,filecontent := parseSegs(sourcePath) lexer := whichLexer(sourcePath) for _, seg := range segs { - if seg.Docs != "" { - seg.DocsRendered = markdown(seg.Docs) - } - if seg.Code != "" { - seg.CodeRendered = cachedPygmentize(lexer, seg.Code) - } + if seg.Docs != "" { + seg.DocsRendered = markdown(seg.Docs) + } + if seg.Code != "" { + seg.CodeRendered = cachedPygmentize(lexer, seg.Code) + } } - return segs + // we are only interested in the 'go' code to pass to play.golang.org + if lexer != "go" { + filecontent = "" + } + return segs,filecontent } func parseExamples() []*Example { @@ -204,9 +239,21 @@ func parseExamples() []*Example { example.Segs = make([][]*Seg, 0) sourcePaths := mustGlob("examples/" + exampleId + "/*") for _, sourcePath := range sourcePaths { - sourceSegs := parseAndRenderSegs(sourcePath) - example.Segs = append(example.Segs, sourceSegs) + switch strings.HasSuffix(sourcePath,".hash") { + case true: + example.GoCodeHash,example.UrlHash = parseHashFile(sourcePath) + default: + sourceSegs,filecontents := parseAndRenderSegs(sourcePath) + if (filecontents != "") { + example.GoCode = filecontents + } + example.Segs = append(example.Segs, sourceSegs) + } } + newCodeHash := sha1Sum(example.GoCode) + if (example.GoCodeHash != newCodeHash) { + example.UrlHash = resetUrlHashFile(newCodeHash,example.GoCode,"examples/"+example.Id+"/"+ example.Id + ".hash") + } examples = append(examples, &example) } } @@ -242,6 +289,7 @@ func main() { copyFile("templates/site.css", siteDir+"/site.css") copyFile("templates/favicon.ico", siteDir+"/favicon.ico") copyFile("templates/404.html", siteDir+"/404.html") + copyFile("templates/play.png", siteDir+"/play.png") examples := parseExamples() renderIndex(examples) renderExamples(examples) From 056d0aff689f716687fade5666b02be736105a72 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Wed, 11 Sep 2013 08:52:05 -0700 Subject: [PATCH 02/10] initial generation for play.golang.org linking, ref #37 --- examples/json/json.go | 2 +- examples/reading-files/reading-files.go | 2 +- examples/slices/slices.go | 2 +- examples/url-parsing/url-parsing.go | 2 +- public/arrays | 1 + public/atomic-counters | 1 + public/base64-encoding | 1 + public/channel-buffering | 1 + public/channel-directions | 1 + public/channel-synchronization | 1 + public/channels | 1 + public/closing-channels | 1 + public/closures | 1 + public/collection-functions | 1 + public/command-line-arguments | 1 + public/command-line-flags | 1 + public/constants | 1 + public/defer | 1 + public/environment-variables | 1 + public/epoch | 1 + public/errors | 1 + public/execing-processes | 1 + public/exit | 1 + public/for | 1 + public/functions | 1 + public/goroutines | 1 + public/hello-world | 1 + public/if-else | 1 + public/interfaces | 1 + public/json | 1 + public/line-filters | 1 + public/maps | 1 + public/methods | 1 + public/multiple-return-values | 1 + public/mutexes | 1 + public/non-blocking-channel-operations | 1 + public/number-parsing | 1 + public/panic | 1 + public/pointers | 1 + public/random-numbers | 1 + public/range | 1 + public/range-over-channels | 1 + public/rate-limiting | 1 + public/reading-files | 1 + public/recursion | 1 + public/regular-expressions | 1 + public/select | 1 + public/sha1-hashes | 1 + public/signals | 1 + public/slices | 1 + public/sorting | 1 + public/sorting-by-functions | 1 + public/spawning-processes | 1 + public/stateful-goroutines | 1 + public/string-formatting | 1 + public/string-functions | 1 + public/structs | 1 + public/switch | 1 + public/tickers | 1 + public/time | 1 + public/time-formatting-parsing | 1 + public/timeouts | 1 + public/timers | 1 + public/url-parsing | 1 + public/values | 1 + public/variables | 1 + public/variadic-functions | 1 + public/worker-pools | 1 + public/writing-files | 1 + tools/generate.go | 80 ++++++++++++------------- 70 files changed, 109 insertions(+), 44 deletions(-) diff --git a/examples/json/json.go b/examples/json/json.go index ac9edad..7b10e0b 100644 --- a/examples/json/json.go +++ b/examples/json/json.go @@ -68,7 +68,7 @@ func main() { // Now let's look at decoding JSON data into Go // values. Here's an example for a generic data - // structure. + // structure. byt := []byte(`{"num":6.0,"strs":["a","b"]}`) // We need to provide a variable where the JSON diff --git a/examples/reading-files/reading-files.go b/examples/reading-files/reading-files.go index c6cbdaf..f07b186 100644 --- a/examples/reading-files/reading-files.go +++ b/examples/reading-files/reading-files.go @@ -69,7 +69,7 @@ func main() { // The `bufio` package implements a buffered // reader that may be useful both for its efficiency // with many small reads and because of the additional - // reading methods it provides. + // reading methods it provides. r4 := bufio.NewReader(f) b4, err := r4.Peek(5) check(err) diff --git a/examples/slices/slices.go b/examples/slices/slices.go index c44cca0..1918f98 100644 --- a/examples/slices/slices.go +++ b/examples/slices/slices.go @@ -27,7 +27,7 @@ func main() { // In addition to these basic operations, slices // support several more that make them richer than - // arrays. One is the builtin `append`, which + // arrays. One is the builtin `append`, which // returns a slice containing one or more new values. // Note that we need to accept a return value from // append as we may get a new slice value. diff --git a/examples/url-parsing/url-parsing.go b/examples/url-parsing/url-parsing.go index 1229bb8..991c6e9 100644 --- a/examples/url-parsing/url-parsing.go +++ b/examples/url-parsing/url-parsing.go @@ -9,7 +9,7 @@ import "strings" func main() { - // We'll parse this example URL, which includes a + // We'll parse this example URL, which includes a // scheme, authentication info, host, port, path, // query params, and query fragment. s := "postgres://user:pass@host.com:5432/path?k=v#f" diff --git a/public/arrays b/public/arrays index 2f24682..be2b767 100644 --- a/public/arrays +++ b/public/arrays @@ -20,6 +20,7 @@

Go by Example: Arrays

+
diff --git a/public/atomic-counters b/public/atomic-counters index 1102b1e..466792e 100644 --- a/public/atomic-counters +++ b/public/atomic-counters @@ -20,6 +20,7 @@

Go by Example: Atomic Counters

+
diff --git a/public/base64-encoding b/public/base64-encoding index 84b987a..e997ded 100644 --- a/public/base64-encoding +++ b/public/base64-encoding @@ -20,6 +20,7 @@

Go by Example: Base64 Encoding

+
diff --git a/public/channel-buffering b/public/channel-buffering index ee0e9b4..db69708 100644 --- a/public/channel-buffering +++ b/public/channel-buffering @@ -20,6 +20,7 @@

Go by Example: Channel Buffering

+
diff --git a/public/channel-directions b/public/channel-directions index 0c9831f..85b7891 100644 --- a/public/channel-directions +++ b/public/channel-directions @@ -20,6 +20,7 @@

Go by Example: Channel Directions

+
diff --git a/public/channel-synchronization b/public/channel-synchronization index 55f85b8..b45c984 100644 --- a/public/channel-synchronization +++ b/public/channel-synchronization @@ -20,6 +20,7 @@

Go by Example: Channel Synchronization

+
diff --git a/public/channels b/public/channels index 799189d..19d1dea 100644 --- a/public/channels +++ b/public/channels @@ -20,6 +20,7 @@

Go by Example: Channels

+
diff --git a/public/closing-channels b/public/closing-channels index 46544e6..f7f754b 100644 --- a/public/closing-channels +++ b/public/closing-channels @@ -20,6 +20,7 @@

Go by Example: Closing Channels

+
diff --git a/public/closures b/public/closures index e38208a..a61523b 100644 --- a/public/closures +++ b/public/closures @@ -20,6 +20,7 @@

Go by Example: Closures

+
diff --git a/public/collection-functions b/public/collection-functions index 0813854..805114d 100644 --- a/public/collection-functions +++ b/public/collection-functions @@ -20,6 +20,7 @@

Go by Example: Collection Functions

+
diff --git a/public/command-line-arguments b/public/command-line-arguments index 327c6d6..c54f7b8 100644 --- a/public/command-line-arguments +++ b/public/command-line-arguments @@ -20,6 +20,7 @@

Go by Example: Command-Line Arguments

+
diff --git a/public/command-line-flags b/public/command-line-flags index 8061b3c..216812d 100644 --- a/public/command-line-flags +++ b/public/command-line-flags @@ -20,6 +20,7 @@

Go by Example: Command-Line Flags

+
diff --git a/public/constants b/public/constants index 813eb93..e282270 100644 --- a/public/constants +++ b/public/constants @@ -20,6 +20,7 @@

Go by Example: Constants

+
diff --git a/public/defer b/public/defer index 4a978c7..0ae3203 100644 --- a/public/defer +++ b/public/defer @@ -20,6 +20,7 @@

Go by Example: Defer

+
diff --git a/public/environment-variables b/public/environment-variables index 5b86db8..1ee4f90 100644 --- a/public/environment-variables +++ b/public/environment-variables @@ -20,6 +20,7 @@

Go by Example: Environment Variables

+
diff --git a/public/epoch b/public/epoch index 1d372b3..9d57b2d 100644 --- a/public/epoch +++ b/public/epoch @@ -20,6 +20,7 @@

Go by Example: Epoch

+
diff --git a/public/errors b/public/errors index 913656c..385df4e 100644 --- a/public/errors +++ b/public/errors @@ -20,6 +20,7 @@

Go by Example: Errors

+
diff --git a/public/execing-processes b/public/execing-processes index 5e9eb34..ffd0a53 100644 --- a/public/execing-processes +++ b/public/execing-processes @@ -20,6 +20,7 @@

Go by Example: Exec'ing Processes

+
diff --git a/public/exit b/public/exit index a0bc797..30d016d 100644 --- a/public/exit +++ b/public/exit @@ -20,6 +20,7 @@

Go by Example: Exit

+
diff --git a/public/for b/public/for index 4d6c435..6f992d1 100644 --- a/public/for +++ b/public/for @@ -20,6 +20,7 @@

Go by Example: For

+
diff --git a/public/functions b/public/functions index 54c3651..b4b78fe 100644 --- a/public/functions +++ b/public/functions @@ -20,6 +20,7 @@

Go by Example: Functions

+
diff --git a/public/goroutines b/public/goroutines index 4fbedf2..523848f 100644 --- a/public/goroutines +++ b/public/goroutines @@ -20,6 +20,7 @@

Go by Example: Goroutines

+
diff --git a/public/hello-world b/public/hello-world index 88176eb..61300c0 100644 --- a/public/hello-world +++ b/public/hello-world @@ -20,6 +20,7 @@

Go by Example: Hello World

+
diff --git a/public/if-else b/public/if-else index 02c00c3..a60d49b 100644 --- a/public/if-else +++ b/public/if-else @@ -20,6 +20,7 @@

Go by Example: If/Else

+
diff --git a/public/interfaces b/public/interfaces index 24a40a7..7206a06 100644 --- a/public/interfaces +++ b/public/interfaces @@ -20,6 +20,7 @@

Go by Example: Interfaces

+
diff --git a/public/json b/public/json index 43bfa4d..95e5e28 100644 --- a/public/json +++ b/public/json @@ -20,6 +20,7 @@

Go by Example: JSON

+
diff --git a/public/line-filters b/public/line-filters index a8a00d8..7a8fd15 100644 --- a/public/line-filters +++ b/public/line-filters @@ -20,6 +20,7 @@

Go by Example: Line Filters

+
diff --git a/public/maps b/public/maps index e8d5d71..ca5c95a 100644 --- a/public/maps +++ b/public/maps @@ -20,6 +20,7 @@

Go by Example: Maps

+
diff --git a/public/methods b/public/methods index b618bc1..a2536a0 100644 --- a/public/methods +++ b/public/methods @@ -20,6 +20,7 @@

Go by Example: Methods

+
diff --git a/public/multiple-return-values b/public/multiple-return-values index 5de0a1f..65613e4 100644 --- a/public/multiple-return-values +++ b/public/multiple-return-values @@ -20,6 +20,7 @@

Go by Example: Multiple Return Values

+
diff --git a/public/mutexes b/public/mutexes index 8a076a7..c4d79dd 100644 --- a/public/mutexes +++ b/public/mutexes @@ -20,6 +20,7 @@

Go by Example: Mutexes

+
diff --git a/public/non-blocking-channel-operations b/public/non-blocking-channel-operations index 4e5e16c..3cebe83 100644 --- a/public/non-blocking-channel-operations +++ b/public/non-blocking-channel-operations @@ -20,6 +20,7 @@

Go by Example: Non-Blocking Channel Operations

+
diff --git a/public/number-parsing b/public/number-parsing index 6d92683..934e924 100644 --- a/public/number-parsing +++ b/public/number-parsing @@ -20,6 +20,7 @@

Go by Example: Number Parsing

+
diff --git a/public/panic b/public/panic index 95620aa..e7448cd 100644 --- a/public/panic +++ b/public/panic @@ -20,6 +20,7 @@

Go by Example: Panic

+
diff --git a/public/pointers b/public/pointers index 598dbfd..127bf24 100644 --- a/public/pointers +++ b/public/pointers @@ -20,6 +20,7 @@

Go by Example: Pointers

+
diff --git a/public/random-numbers b/public/random-numbers index 384a074..1ea1252 100644 --- a/public/random-numbers +++ b/public/random-numbers @@ -20,6 +20,7 @@

Go by Example: Random Numbers

+
diff --git a/public/range b/public/range index 36fb3c1..0096293 100644 --- a/public/range +++ b/public/range @@ -20,6 +20,7 @@

Go by Example: Range

+
diff --git a/public/range-over-channels b/public/range-over-channels index 0690cf4..d8507ad 100644 --- a/public/range-over-channels +++ b/public/range-over-channels @@ -20,6 +20,7 @@

Go by Example: Range over Channels

+
diff --git a/public/rate-limiting b/public/rate-limiting index cf5a9c6..f403da6 100644 --- a/public/rate-limiting +++ b/public/rate-limiting @@ -20,6 +20,7 @@

Go by Example: Rate Limiting

+
diff --git a/public/reading-files b/public/reading-files index 6517921..778f0a8 100644 --- a/public/reading-files +++ b/public/reading-files @@ -20,6 +20,7 @@

Go by Example: Reading Files

+
diff --git a/public/recursion b/public/recursion index df21191..c849ae4 100644 --- a/public/recursion +++ b/public/recursion @@ -20,6 +20,7 @@

Go by Example: Recursion

+
diff --git a/public/regular-expressions b/public/regular-expressions index 9d82695..522473f 100644 --- a/public/regular-expressions +++ b/public/regular-expressions @@ -20,6 +20,7 @@

Go by Example: Regular Expressions

+
diff --git a/public/select b/public/select index de44372..5edc2ae 100644 --- a/public/select +++ b/public/select @@ -20,6 +20,7 @@

Go by Example: Select

+
diff --git a/public/sha1-hashes b/public/sha1-hashes index 9a7d958..e08d2cd 100644 --- a/public/sha1-hashes +++ b/public/sha1-hashes @@ -20,6 +20,7 @@

Go by Example: SHA1 Hashes

+
diff --git a/public/signals b/public/signals index 6820a9c..29a4c64 100644 --- a/public/signals +++ b/public/signals @@ -20,6 +20,7 @@

Go by Example: Signals

+
diff --git a/public/slices b/public/slices index 1f39e96..1ac261d 100644 --- a/public/slices +++ b/public/slices @@ -20,6 +20,7 @@

Go by Example: Slices

+
diff --git a/public/sorting b/public/sorting index a8dc00d..ac16a99 100644 --- a/public/sorting +++ b/public/sorting @@ -20,6 +20,7 @@

Go by Example: Sorting

+
diff --git a/public/sorting-by-functions b/public/sorting-by-functions index 901cbce..f1b172b 100644 --- a/public/sorting-by-functions +++ b/public/sorting-by-functions @@ -20,6 +20,7 @@

Go by Example: Sorting by Functions

+
diff --git a/public/spawning-processes b/public/spawning-processes index 56e9ae1..1f42780 100644 --- a/public/spawning-processes +++ b/public/spawning-processes @@ -20,6 +20,7 @@

Go by Example: Spawning Processes

+
diff --git a/public/stateful-goroutines b/public/stateful-goroutines index e78f2d8..02ad6b7 100644 --- a/public/stateful-goroutines +++ b/public/stateful-goroutines @@ -20,6 +20,7 @@

Go by Example: Stateful Goroutines

+
diff --git a/public/string-formatting b/public/string-formatting index be4465d..d0823d6 100644 --- a/public/string-formatting +++ b/public/string-formatting @@ -20,6 +20,7 @@

Go by Example: String Formatting

+
diff --git a/public/string-functions b/public/string-functions index 9fb9bc7..07e70c1 100644 --- a/public/string-functions +++ b/public/string-functions @@ -20,6 +20,7 @@

Go by Example: String Functions

+
diff --git a/public/structs b/public/structs index 031d0ee..eab7abd 100644 --- a/public/structs +++ b/public/structs @@ -20,6 +20,7 @@

Go by Example: Structs

+
diff --git a/public/switch b/public/switch index 66cdc89..1e583ef 100644 --- a/public/switch +++ b/public/switch @@ -20,6 +20,7 @@

Go by Example: Switch

+
diff --git a/public/tickers b/public/tickers index 78abefb..e09ed05 100644 --- a/public/tickers +++ b/public/tickers @@ -20,6 +20,7 @@

Go by Example: Tickers

+
diff --git a/public/time b/public/time index 9b6c9f6..ea29d17 100644 --- a/public/time +++ b/public/time @@ -20,6 +20,7 @@

Go by Example: Time

+
diff --git a/public/time-formatting-parsing b/public/time-formatting-parsing index ae325c5..201e063 100644 --- a/public/time-formatting-parsing +++ b/public/time-formatting-parsing @@ -20,6 +20,7 @@

Go by Example: Time Formatting / Parsing

+
diff --git a/public/timeouts b/public/timeouts index 0a79faa..1547f58 100644 --- a/public/timeouts +++ b/public/timeouts @@ -20,6 +20,7 @@

Go by Example: Timeouts

+
diff --git a/public/timers b/public/timers index 2c1452a..c3726e5 100644 --- a/public/timers +++ b/public/timers @@ -20,6 +20,7 @@

Go by Example: Timers

+
diff --git a/public/url-parsing b/public/url-parsing index ed41e56..40b9d2e 100644 --- a/public/url-parsing +++ b/public/url-parsing @@ -20,6 +20,7 @@

Go by Example: URL Parsing

+
diff --git a/public/values b/public/values index 6f6c644..a77ef9f 100644 --- a/public/values +++ b/public/values @@ -20,6 +20,7 @@

Go by Example: Values

+
diff --git a/public/variables b/public/variables index 7c079ca..5db31b5 100644 --- a/public/variables +++ b/public/variables @@ -20,6 +20,7 @@

Go by Example: Variables

+
diff --git a/public/variadic-functions b/public/variadic-functions index c273143..793c97f 100644 --- a/public/variadic-functions +++ b/public/variadic-functions @@ -20,6 +20,7 @@

Go by Example: Variadic Functions

+
diff --git a/public/worker-pools b/public/worker-pools index 258a305..a13cb50 100644 --- a/public/worker-pools +++ b/public/worker-pools @@ -20,6 +20,7 @@

Go by Example: Worker Pools

+
diff --git a/public/writing-files b/public/writing-files index 3753007..8fbeb6b 100644 --- a/public/writing-files +++ b/public/writing-files @@ -20,6 +20,7 @@

Go by Example: Writing Files

+
diff --git a/tools/generate.go b/tools/generate.go index 1286bb5..fc1df7b 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -124,24 +124,24 @@ type Seg struct { } type Example struct { - Id, Name string - GoCode, GoCodeHash, UrlHash string - Segs [][]*Seg - NextExample *Example + Id, Name string + GoCode, GoCodeHash, UrlHash string + Segs [][]*Seg + NextExample *Example } func parseHashFile(sourcePath string) (string, string) { - var codehash,urlkey string + var codehash, urlkey string lines := readLines(sourcePath) - for idx,line := range lines { - switch idx { - case 0: - codehash = line - case 1: - urlkey = line - } + for idx, line := range lines { + switch idx { + case 0: + codehash = line + case 1: + urlkey = line + } } - return codehash,urlkey + return codehash, urlkey } func resetUrlHashFile(codehash, code, sourcePath string) string { @@ -153,8 +153,8 @@ func resetUrlHashFile(codehash, code, sourcePath string) string { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) urlkey := string(body) - data := fmt.Sprintf("%s\n%s",codehash,urlkey) - ioutil.WriteFile(sourcePath,[]byte(data),0644) + data := fmt.Sprintf("%s\n%s", codehash, urlkey) + ioutil.WriteFile(sourcePath, []byte(data), 0644) return urlkey } @@ -203,25 +203,25 @@ func parseSegs(sourcePath string) ([]*Seg, string) { seg.CodeEmpty = (seg.Code == "") seg.CodeLeading = (i < (len(segs) - 1)) } - return segs,filecontent + return segs, filecontent } func parseAndRenderSegs(sourcePath string) ([]*Seg, string) { - segs,filecontent := parseSegs(sourcePath) + segs, filecontent := parseSegs(sourcePath) lexer := whichLexer(sourcePath) for _, seg := range segs { - if seg.Docs != "" { - seg.DocsRendered = markdown(seg.Docs) - } - if seg.Code != "" { - seg.CodeRendered = cachedPygmentize(lexer, seg.Code) - } + if seg.Docs != "" { + seg.DocsRendered = markdown(seg.Docs) + } + if seg.Code != "" { + seg.CodeRendered = cachedPygmentize(lexer, seg.Code) + } } // we are only interested in the 'go' code to pass to play.golang.org if lexer != "go" { - filecontent = "" - } - return segs,filecontent + filecontent = "" + } + return segs, filecontent } func parseExamples() []*Example { @@ -239,21 +239,21 @@ func parseExamples() []*Example { example.Segs = make([][]*Seg, 0) sourcePaths := mustGlob("examples/" + exampleId + "/*") for _, sourcePath := range sourcePaths { - switch strings.HasSuffix(sourcePath,".hash") { - case true: - example.GoCodeHash,example.UrlHash = parseHashFile(sourcePath) - default: - sourceSegs,filecontents := parseAndRenderSegs(sourcePath) - if (filecontents != "") { - example.GoCode = filecontents - } - example.Segs = append(example.Segs, sourceSegs) - } + switch strings.HasSuffix(sourcePath, ".hash") { + case true: + example.GoCodeHash, example.UrlHash = parseHashFile(sourcePath) + default: + sourceSegs, filecontents := parseAndRenderSegs(sourcePath) + if filecontents != "" { + example.GoCode = filecontents + } + example.Segs = append(example.Segs, sourceSegs) + } + } + newCodeHash := sha1Sum(example.GoCode) + if example.GoCodeHash != newCodeHash { + example.UrlHash = resetUrlHashFile(newCodeHash, example.GoCode, "examples/"+example.Id+"/"+example.Id+".hash") } - newCodeHash := sha1Sum(example.GoCode) - if (example.GoCodeHash != newCodeHash) { - example.UrlHash = resetUrlHashFile(newCodeHash,example.GoCode,"examples/"+example.Id+"/"+ example.Id + ".hash") - } examples = append(examples, &example) } } From e77dcdddd4f45b321265cbc246504e63400dd441 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Wed, 11 Sep 2013 09:01:11 -0700 Subject: [PATCH 03/10] missing some generated files --- examples/arrays/arrays.hash | 2 ++ examples/atomic-counters/atomic-counters.hash | 2 ++ examples/base64-encoding/base64-encoding.hash | 2 ++ .../channel-buffering/channel-buffering.hash | 2 ++ .../channel-directions/channel-directions.hash | 2 ++ .../channel-synchronization.hash | 2 ++ examples/channels/channels.hash | 2 ++ examples/closing-channels/closing-channels.hash | 2 ++ examples/closures/closures.hash | 2 ++ .../collection-functions.hash | 2 ++ .../command-line-arguments.hash | 2 ++ .../command-line-flags/command-line-flags.hash | 2 ++ examples/constants/constants.hash | 2 ++ examples/defer/defer.hash | 2 ++ .../environment-variables.hash | 2 ++ examples/epoch/epoch.hash | 2 ++ examples/errors/errors.hash | 2 ++ .../execing-processes/execing-processes.hash | 2 ++ examples/exit/exit.hash | 2 ++ examples/for/for.hash | 2 ++ examples/functions/functions.hash | 2 ++ examples/goroutines/goroutines.hash | 2 ++ examples/hello-world/hello-world.hash | 2 ++ examples/if-else/if-else.hash | 2 ++ examples/interfaces/interfaces.hash | 2 ++ examples/json/json.hash | 2 ++ examples/line-filters/line-filters.hash | 2 ++ examples/maps/maps.hash | 2 ++ examples/methods/methods.hash | 2 ++ .../multiple-return-values.hash | 2 ++ examples/mutexes/mutexes.hash | 2 ++ .../non-blocking-channel-operations.hash | 2 ++ examples/number-parsing/number-parsing.hash | 2 ++ examples/panic/panic.hash | 2 ++ examples/pointers/pointers.hash | 2 ++ examples/random-numbers/random-numbers.hash | 2 ++ .../range-over-channels.hash | 2 ++ examples/range/range.hash | 2 ++ examples/rate-limiting/rate-limiting.hash | 2 ++ examples/reading-files/reading-files.hash | 2 ++ examples/recursion/recursion.hash | 2 ++ .../regular-expressions.hash | 2 ++ examples/select/select.hash | 2 ++ examples/sha1-hashes/sha1-hashes.hash | 2 ++ examples/signals/signals.hash | 2 ++ examples/slices/slices.hash | 2 ++ .../sorting-by-functions.hash | 2 ++ examples/sorting/sorting.hash | 2 ++ .../spawning-processes/spawning-processes.hash | 2 ++ .../stateful-goroutines.hash | 2 ++ .../string-formatting/string-formatting.hash | 2 ++ examples/string-functions/string-functions.hash | 2 ++ examples/structs/structs.hash | 2 ++ examples/switch/switch.hash | 2 ++ examples/tickers/tickers.hash | 2 ++ .../time-formatting-parsing.hash | 2 ++ examples/time/time.hash | 2 ++ examples/timeouts/timeouts.hash | 2 ++ examples/timers/timers.hash | 2 ++ examples/url-parsing/url-parsing.hash | 2 ++ examples/values/values.hash | 2 ++ examples/variables/variables.hash | 2 ++ .../variadic-functions/variadic-functions.hash | 2 ++ examples/worker-pools/worker-pools.hash | 2 ++ examples/writing-files/writing-files.hash | 2 ++ public/play.png | Bin 0 -> 30822 bytes 66 files changed, 130 insertions(+) create mode 100644 examples/arrays/arrays.hash create mode 100644 examples/atomic-counters/atomic-counters.hash create mode 100644 examples/base64-encoding/base64-encoding.hash create mode 100644 examples/channel-buffering/channel-buffering.hash create mode 100644 examples/channel-directions/channel-directions.hash create mode 100644 examples/channel-synchronization/channel-synchronization.hash create mode 100644 examples/channels/channels.hash create mode 100644 examples/closing-channels/closing-channels.hash create mode 100644 examples/closures/closures.hash create mode 100644 examples/collection-functions/collection-functions.hash create mode 100644 examples/command-line-arguments/command-line-arguments.hash create mode 100644 examples/command-line-flags/command-line-flags.hash create mode 100644 examples/constants/constants.hash create mode 100644 examples/defer/defer.hash create mode 100644 examples/environment-variables/environment-variables.hash create mode 100644 examples/epoch/epoch.hash create mode 100644 examples/errors/errors.hash create mode 100644 examples/execing-processes/execing-processes.hash create mode 100644 examples/exit/exit.hash create mode 100644 examples/for/for.hash create mode 100644 examples/functions/functions.hash create mode 100644 examples/goroutines/goroutines.hash create mode 100644 examples/hello-world/hello-world.hash create mode 100644 examples/if-else/if-else.hash create mode 100644 examples/interfaces/interfaces.hash create mode 100644 examples/json/json.hash create mode 100644 examples/line-filters/line-filters.hash create mode 100644 examples/maps/maps.hash create mode 100644 examples/methods/methods.hash create mode 100644 examples/multiple-return-values/multiple-return-values.hash create mode 100644 examples/mutexes/mutexes.hash create mode 100644 examples/non-blocking-channel-operations/non-blocking-channel-operations.hash create mode 100644 examples/number-parsing/number-parsing.hash create mode 100644 examples/panic/panic.hash create mode 100644 examples/pointers/pointers.hash create mode 100644 examples/random-numbers/random-numbers.hash create mode 100644 examples/range-over-channels/range-over-channels.hash create mode 100644 examples/range/range.hash create mode 100644 examples/rate-limiting/rate-limiting.hash create mode 100644 examples/reading-files/reading-files.hash create mode 100644 examples/recursion/recursion.hash create mode 100644 examples/regular-expressions/regular-expressions.hash create mode 100644 examples/select/select.hash create mode 100644 examples/sha1-hashes/sha1-hashes.hash create mode 100644 examples/signals/signals.hash create mode 100644 examples/slices/slices.hash create mode 100644 examples/sorting-by-functions/sorting-by-functions.hash create mode 100644 examples/sorting/sorting.hash create mode 100644 examples/spawning-processes/spawning-processes.hash create mode 100644 examples/stateful-goroutines/stateful-goroutines.hash create mode 100644 examples/string-formatting/string-formatting.hash create mode 100644 examples/string-functions/string-functions.hash create mode 100644 examples/structs/structs.hash create mode 100644 examples/switch/switch.hash create mode 100644 examples/tickers/tickers.hash create mode 100644 examples/time-formatting-parsing/time-formatting-parsing.hash create mode 100644 examples/time/time.hash create mode 100644 examples/timeouts/timeouts.hash create mode 100644 examples/timers/timers.hash create mode 100644 examples/url-parsing/url-parsing.hash create mode 100644 examples/values/values.hash create mode 100644 examples/variables/variables.hash create mode 100644 examples/variadic-functions/variadic-functions.hash create mode 100644 examples/worker-pools/worker-pools.hash create mode 100644 examples/writing-files/writing-files.hash create mode 100644 public/play.png diff --git a/examples/arrays/arrays.hash b/examples/arrays/arrays.hash new file mode 100644 index 0000000..8829b48 --- /dev/null +++ b/examples/arrays/arrays.hash @@ -0,0 +1,2 @@ +305975d13d24223181d13f042b290906d86c1a0e +l-A8eBnwio \ No newline at end of file diff --git a/examples/atomic-counters/atomic-counters.hash b/examples/atomic-counters/atomic-counters.hash new file mode 100644 index 0000000..29cdd11 --- /dev/null +++ b/examples/atomic-counters/atomic-counters.hash @@ -0,0 +1,2 @@ +97f1f28e352163cb841fb26dc05dced9fa8efde5 +sKIaNsJquU \ No newline at end of file diff --git a/examples/base64-encoding/base64-encoding.hash b/examples/base64-encoding/base64-encoding.hash new file mode 100644 index 0000000..eb57a13 --- /dev/null +++ b/examples/base64-encoding/base64-encoding.hash @@ -0,0 +1,2 @@ +e57f5be3a796261fb4a55cdb0580a254e14b4930 +t6rFm2x4Yr \ No newline at end of file diff --git a/examples/channel-buffering/channel-buffering.hash b/examples/channel-buffering/channel-buffering.hash new file mode 100644 index 0000000..75f737f --- /dev/null +++ b/examples/channel-buffering/channel-buffering.hash @@ -0,0 +1,2 @@ +122140f7ad1bc5cff4fcd7a9e7245b87aaca3ec5 +34PVHwO6Bn \ No newline at end of file diff --git a/examples/channel-directions/channel-directions.hash b/examples/channel-directions/channel-directions.hash new file mode 100644 index 0000000..b79f6f2 --- /dev/null +++ b/examples/channel-directions/channel-directions.hash @@ -0,0 +1,2 @@ +635cc13dfe33123ac188e01e3002d3aa935d765f +P9Fujfpa1f \ No newline at end of file diff --git a/examples/channel-synchronization/channel-synchronization.hash b/examples/channel-synchronization/channel-synchronization.hash new file mode 100644 index 0000000..0365d99 --- /dev/null +++ b/examples/channel-synchronization/channel-synchronization.hash @@ -0,0 +1,2 @@ +fe3e2ea1a67d0f95ce4cb18f3e8aa16d416de0ce +0DfW-1RMqi \ No newline at end of file diff --git a/examples/channels/channels.hash b/examples/channels/channels.hash new file mode 100644 index 0000000..93cb176 --- /dev/null +++ b/examples/channels/channels.hash @@ -0,0 +1,2 @@ +be6689b44773c1f7a83d409d1e2f5ba7d6c7b006 +aVTMoY5FNt \ No newline at end of file diff --git a/examples/closing-channels/closing-channels.hash b/examples/closing-channels/closing-channels.hash new file mode 100644 index 0000000..04f044b --- /dev/null +++ b/examples/closing-channels/closing-channels.hash @@ -0,0 +1,2 @@ +5205898a520533e46ea24c849848d19ebc2d08a9 +eFZ2SeKswH \ No newline at end of file diff --git a/examples/closures/closures.hash b/examples/closures/closures.hash new file mode 100644 index 0000000..6e0c5cc --- /dev/null +++ b/examples/closures/closures.hash @@ -0,0 +1,2 @@ +2e062d01989caada16c4b22ff6a35cd58e4eb819 +gQtEWkhWyp \ No newline at end of file diff --git a/examples/collection-functions/collection-functions.hash b/examples/collection-functions/collection-functions.hash new file mode 100644 index 0000000..442b559 --- /dev/null +++ b/examples/collection-functions/collection-functions.hash @@ -0,0 +1,2 @@ +ed54b3fc0512ccace0f3d0b74975c9bcd2e7a8a2 +3PNdke3Wia \ No newline at end of file diff --git a/examples/command-line-arguments/command-line-arguments.hash b/examples/command-line-arguments/command-line-arguments.hash new file mode 100644 index 0000000..0fec98d --- /dev/null +++ b/examples/command-line-arguments/command-line-arguments.hash @@ -0,0 +1,2 @@ +41c970a1ef29ad2a05307e6c783ff52ab80eaccd +44uyYt_TRl \ No newline at end of file diff --git a/examples/command-line-flags/command-line-flags.hash b/examples/command-line-flags/command-line-flags.hash new file mode 100644 index 0000000..f61c676 --- /dev/null +++ b/examples/command-line-flags/command-line-flags.hash @@ -0,0 +1,2 @@ +a22c44511e84451cca813659f3803fb7ae48dab0 +9xlvGqQjhl \ No newline at end of file diff --git a/examples/constants/constants.hash b/examples/constants/constants.hash new file mode 100644 index 0000000..1d4f27d --- /dev/null +++ b/examples/constants/constants.hash @@ -0,0 +1,2 @@ +3de4f16f1ed032378268411b2173b95e8000305d +T5sj0eINnp \ No newline at end of file diff --git a/examples/defer/defer.hash b/examples/defer/defer.hash new file mode 100644 index 0000000..e8e6ae7 --- /dev/null +++ b/examples/defer/defer.hash @@ -0,0 +1,2 @@ +570699fc50a1d39e9d0ad6a4461aef3248b080e1 +9aoHwzHcAo \ No newline at end of file diff --git a/examples/environment-variables/environment-variables.hash b/examples/environment-variables/environment-variables.hash new file mode 100644 index 0000000..b4b5b15 --- /dev/null +++ b/examples/environment-variables/environment-variables.hash @@ -0,0 +1,2 @@ +4d0832c5a1ddd4e95474791e8802c15452358214 +kfqLhpmEpw \ No newline at end of file diff --git a/examples/epoch/epoch.hash b/examples/epoch/epoch.hash new file mode 100644 index 0000000..8628834 --- /dev/null +++ b/examples/epoch/epoch.hash @@ -0,0 +1,2 @@ +b56f9122928886ac695c15657c2ff5ec7c5436d9 +3jXHvYbLUz \ No newline at end of file diff --git a/examples/errors/errors.hash b/examples/errors/errors.hash new file mode 100644 index 0000000..43f7825 --- /dev/null +++ b/examples/errors/errors.hash @@ -0,0 +1,2 @@ +07cffb3d4e37162ab7e9e0a192561ddc8042b81a +BmDQXkPPTk \ No newline at end of file diff --git a/examples/execing-processes/execing-processes.hash b/examples/execing-processes/execing-processes.hash new file mode 100644 index 0000000..132068d --- /dev/null +++ b/examples/execing-processes/execing-processes.hash @@ -0,0 +1,2 @@ +ae75526fdd970c450fa3ed52c70cf400a45d0770 +iEAD2cYC-h \ No newline at end of file diff --git a/examples/exit/exit.hash b/examples/exit/exit.hash new file mode 100644 index 0000000..220c28b --- /dev/null +++ b/examples/exit/exit.hash @@ -0,0 +1,2 @@ +dc0bb3eaafa045d6aa05e88aff39322a1ccf822e +CDiAh9SXRM \ No newline at end of file diff --git a/examples/for/for.hash b/examples/for/for.hash new file mode 100644 index 0000000..a3dd2ba --- /dev/null +++ b/examples/for/for.hash @@ -0,0 +1,2 @@ +e7dbd5f44ea79a3eb41e4535575197b9eadc0e03 +mGqqcBZ0jv \ No newline at end of file diff --git a/examples/functions/functions.hash b/examples/functions/functions.hash new file mode 100644 index 0000000..92aacbc --- /dev/null +++ b/examples/functions/functions.hash @@ -0,0 +1,2 @@ +19cac21e4a057e8335ce78a30de9a43c2b18d522 +2EXoOWfGf_ \ No newline at end of file diff --git a/examples/goroutines/goroutines.hash b/examples/goroutines/goroutines.hash new file mode 100644 index 0000000..60c5e96 --- /dev/null +++ b/examples/goroutines/goroutines.hash @@ -0,0 +1,2 @@ +5562eb9bebe9ed442e8fa6801fab86b00fd1d2ba +aIO_Wi3hJj \ No newline at end of file diff --git a/examples/hello-world/hello-world.hash b/examples/hello-world/hello-world.hash new file mode 100644 index 0000000..9b91757 --- /dev/null +++ b/examples/hello-world/hello-world.hash @@ -0,0 +1,2 @@ +66ef79aa3cbc8789c141ce7031fb3f493e003aad +H8bxSpw9Jq \ No newline at end of file diff --git a/examples/if-else/if-else.hash b/examples/if-else/if-else.hash new file mode 100644 index 0000000..8576ed7 --- /dev/null +++ b/examples/if-else/if-else.hash @@ -0,0 +1,2 @@ +4187a4268be1cd85fdd6e9a211d1e4f534666ad6 +p_ykufAYRj \ No newline at end of file diff --git a/examples/interfaces/interfaces.hash b/examples/interfaces/interfaces.hash new file mode 100644 index 0000000..abea922 --- /dev/null +++ b/examples/interfaces/interfaces.hash @@ -0,0 +1,2 @@ +853be73c5685a0510da77c22c64727afa7fb0581 +vx8bwC-Bmq \ No newline at end of file diff --git a/examples/json/json.hash b/examples/json/json.hash new file mode 100644 index 0000000..4b169ec --- /dev/null +++ b/examples/json/json.hash @@ -0,0 +1,2 @@ +12f985bb444e2bd6d72ea52a24ebc5f4f82c5b9b +4L2wMVv7tW \ No newline at end of file diff --git a/examples/line-filters/line-filters.hash b/examples/line-filters/line-filters.hash new file mode 100644 index 0000000..c0d2f9a --- /dev/null +++ b/examples/line-filters/line-filters.hash @@ -0,0 +1,2 @@ +fe6d70a3115bd0974aa6f3f8444bb539d17fc027 +OSS71nSpkV \ No newline at end of file diff --git a/examples/maps/maps.hash b/examples/maps/maps.hash new file mode 100644 index 0000000..1465005 --- /dev/null +++ b/examples/maps/maps.hash @@ -0,0 +1,2 @@ +572365c80895f32241032397bd69094886892d90 +D-F9YN_V8r \ No newline at end of file diff --git a/examples/methods/methods.hash b/examples/methods/methods.hash new file mode 100644 index 0000000..4309922 --- /dev/null +++ b/examples/methods/methods.hash @@ -0,0 +1,2 @@ +24cfb9ad45e43c2d49163149bc55925a4e1b3c7a +254m_9Yjwa \ No newline at end of file diff --git a/examples/multiple-return-values/multiple-return-values.hash b/examples/multiple-return-values/multiple-return-values.hash new file mode 100644 index 0000000..c7abd5a --- /dev/null +++ b/examples/multiple-return-values/multiple-return-values.hash @@ -0,0 +1,2 @@ +9e0a75102d83565fefbf1893728b15633dc44a2c +LrDt1Wah0M \ No newline at end of file diff --git a/examples/mutexes/mutexes.hash b/examples/mutexes/mutexes.hash new file mode 100644 index 0000000..2d3d757 --- /dev/null +++ b/examples/mutexes/mutexes.hash @@ -0,0 +1,2 @@ +a42e6b574ab2c2bdd38df53d77b9a2f3f3e0b10c +-_LKNceBru \ No newline at end of file diff --git a/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash b/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash new file mode 100644 index 0000000..8e78305 --- /dev/null +++ b/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash @@ -0,0 +1,2 @@ +119ced4df4f79795b163483b6abfd855e76ef577 +M972dltae2 \ No newline at end of file diff --git a/examples/number-parsing/number-parsing.hash b/examples/number-parsing/number-parsing.hash new file mode 100644 index 0000000..6c02da7 --- /dev/null +++ b/examples/number-parsing/number-parsing.hash @@ -0,0 +1,2 @@ +0d2155e9863a73c098d44637e92403d7f5e8e965 +N90EppECFk \ No newline at end of file diff --git a/examples/panic/panic.hash b/examples/panic/panic.hash new file mode 100644 index 0000000..e10b4de --- /dev/null +++ b/examples/panic/panic.hash @@ -0,0 +1,2 @@ +91639bbcfcc6ed088295a9ee6b1c36ab35ae402a +c86oXzfQOt \ No newline at end of file diff --git a/examples/pointers/pointers.hash b/examples/pointers/pointers.hash new file mode 100644 index 0000000..dc14689 --- /dev/null +++ b/examples/pointers/pointers.hash @@ -0,0 +1,2 @@ +85cff3345d2f22b65a5d54eb8f7aa8f508f27887 +KdE4TBbUL2 \ No newline at end of file diff --git a/examples/random-numbers/random-numbers.hash b/examples/random-numbers/random-numbers.hash new file mode 100644 index 0000000..5f7c74d --- /dev/null +++ b/examples/random-numbers/random-numbers.hash @@ -0,0 +1,2 @@ +62b0562c92dd84ecb9408df4c517031d75b1e337 +C0_kuFx3ET \ No newline at end of file diff --git a/examples/range-over-channels/range-over-channels.hash b/examples/range-over-channels/range-over-channels.hash new file mode 100644 index 0000000..88af611 --- /dev/null +++ b/examples/range-over-channels/range-over-channels.hash @@ -0,0 +1,2 @@ +e415b1f2ae531b319bb9aca69b17e7b916511744 +WN7NNh9tvh \ No newline at end of file diff --git a/examples/range/range.hash b/examples/range/range.hash new file mode 100644 index 0000000..8ca87df --- /dev/null +++ b/examples/range/range.hash @@ -0,0 +1,2 @@ +e6458150862a6b26e95629ba6a90a6a3036d7d52 +Ys3V-ohVRy \ No newline at end of file diff --git a/examples/rate-limiting/rate-limiting.hash b/examples/rate-limiting/rate-limiting.hash new file mode 100644 index 0000000..6cbaac8 --- /dev/null +++ b/examples/rate-limiting/rate-limiting.hash @@ -0,0 +1,2 @@ +d74aebb12f618f22ec776eb5b4de92985104c197 +e7yzIk97-p \ No newline at end of file diff --git a/examples/reading-files/reading-files.hash b/examples/reading-files/reading-files.hash new file mode 100644 index 0000000..6141596 --- /dev/null +++ b/examples/reading-files/reading-files.hash @@ -0,0 +1,2 @@ +251ab050de24051bb7d9858940421fdec41fa674 +VcLqpSwnkN \ No newline at end of file diff --git a/examples/recursion/recursion.hash b/examples/recursion/recursion.hash new file mode 100644 index 0000000..0967049 --- /dev/null +++ b/examples/recursion/recursion.hash @@ -0,0 +1,2 @@ +5d1ba6b03a50ccae2a0f46865eb72c587e11857c +RFn-rf42ap \ No newline at end of file diff --git a/examples/regular-expressions/regular-expressions.hash b/examples/regular-expressions/regular-expressions.hash new file mode 100644 index 0000000..fa96776 --- /dev/null +++ b/examples/regular-expressions/regular-expressions.hash @@ -0,0 +1,2 @@ +0ebd0a44997fe20d3fa0caa8b5f2cfa96ff1db13 +7bnr2EXlxK \ No newline at end of file diff --git a/examples/select/select.hash b/examples/select/select.hash new file mode 100644 index 0000000..f55c050 --- /dev/null +++ b/examples/select/select.hash @@ -0,0 +1,2 @@ +572ae309be3d0fd9b029aeb908013b2914a36734 +NGSkDrli6L \ No newline at end of file diff --git a/examples/sha1-hashes/sha1-hashes.hash b/examples/sha1-hashes/sha1-hashes.hash new file mode 100644 index 0000000..eed7392 --- /dev/null +++ b/examples/sha1-hashes/sha1-hashes.hash @@ -0,0 +1,2 @@ +6a896270e34f2696b881a8fa7e68bfff57dee51f +YUaWWEeB4U \ No newline at end of file diff --git a/examples/signals/signals.hash b/examples/signals/signals.hash new file mode 100644 index 0000000..9fe5134 --- /dev/null +++ b/examples/signals/signals.hash @@ -0,0 +1,2 @@ +42ec8f6064228f89f97e2798150d741317d2bf05 +d42wO1q1oh \ No newline at end of file diff --git a/examples/slices/slices.hash b/examples/slices/slices.hash new file mode 100644 index 0000000..c5f0317 --- /dev/null +++ b/examples/slices/slices.hash @@ -0,0 +1,2 @@ +d900c3b1cf2bd96591f7ad7ce7fd9e592ec31139 +dPQErsP6Yc \ No newline at end of file diff --git a/examples/sorting-by-functions/sorting-by-functions.hash b/examples/sorting-by-functions/sorting-by-functions.hash new file mode 100644 index 0000000..300641a --- /dev/null +++ b/examples/sorting-by-functions/sorting-by-functions.hash @@ -0,0 +1,2 @@ +9b184444231f799b9388037d8142613a598e9345 +M06NADP985 \ No newline at end of file diff --git a/examples/sorting/sorting.hash b/examples/sorting/sorting.hash new file mode 100644 index 0000000..4c4ddf9 --- /dev/null +++ b/examples/sorting/sorting.hash @@ -0,0 +1,2 @@ +4e576421f2bdbd11847c367d223bd30d0e301990 +roQOJXtqAb \ No newline at end of file diff --git a/examples/spawning-processes/spawning-processes.hash b/examples/spawning-processes/spawning-processes.hash new file mode 100644 index 0000000..4d9b30a --- /dev/null +++ b/examples/spawning-processes/spawning-processes.hash @@ -0,0 +1,2 @@ +4e31686ab1dac4fa0e3ce753a6af207c51b9b049 +utd_H-XJtC \ No newline at end of file diff --git a/examples/stateful-goroutines/stateful-goroutines.hash b/examples/stateful-goroutines/stateful-goroutines.hash new file mode 100644 index 0000000..be922ae --- /dev/null +++ b/examples/stateful-goroutines/stateful-goroutines.hash @@ -0,0 +1,2 @@ +13c5072f2ccb7afb85b8c7ea9a97f94423aef8de +2YrrJo4H6W \ No newline at end of file diff --git a/examples/string-formatting/string-formatting.hash b/examples/string-formatting/string-formatting.hash new file mode 100644 index 0000000..4c2ff3d --- /dev/null +++ b/examples/string-formatting/string-formatting.hash @@ -0,0 +1,2 @@ +fece72ed980c2ee55b3f1d5d8e8d83aed81dc814 +qayRuqXHym \ No newline at end of file diff --git a/examples/string-functions/string-functions.hash b/examples/string-functions/string-functions.hash new file mode 100644 index 0000000..7fdbc50 --- /dev/null +++ b/examples/string-functions/string-functions.hash @@ -0,0 +1,2 @@ +66fdf78c9be9a41e52bcf2e8b01ab95fa7753401 +COXm374QWe \ No newline at end of file diff --git a/examples/structs/structs.hash b/examples/structs/structs.hash new file mode 100644 index 0000000..136b045 --- /dev/null +++ b/examples/structs/structs.hash @@ -0,0 +1,2 @@ +49cad39331ee5e9fb8d8dad99d3aff7f18a4e6d0 +OMCP5KFC10 \ No newline at end of file diff --git a/examples/switch/switch.hash b/examples/switch/switch.hash new file mode 100644 index 0000000..c5d2490 --- /dev/null +++ b/examples/switch/switch.hash @@ -0,0 +1,2 @@ +1040d0721b871f78f221a0e9e4a61ea3b0e6de70 +8b5CajPcHn \ No newline at end of file diff --git a/examples/tickers/tickers.hash b/examples/tickers/tickers.hash new file mode 100644 index 0000000..c08c31c --- /dev/null +++ b/examples/tickers/tickers.hash @@ -0,0 +1,2 @@ +39781500e9ccbd39282e2dce5cb8003715bfe78a +U0PO7ZZU3l \ No newline at end of file diff --git a/examples/time-formatting-parsing/time-formatting-parsing.hash b/examples/time-formatting-parsing/time-formatting-parsing.hash new file mode 100644 index 0000000..aa78838 --- /dev/null +++ b/examples/time-formatting-parsing/time-formatting-parsing.hash @@ -0,0 +1,2 @@ +89dedeb30079f7f5f42202c249609c570563a1ae +JqNGqbuqF1 \ No newline at end of file diff --git a/examples/time/time.hash b/examples/time/time.hash new file mode 100644 index 0000000..819dcfc --- /dev/null +++ b/examples/time/time.hash @@ -0,0 +1,2 @@ +a5fb723728be749919194acf860f483a7c2329c7 +NxuQTlVA2l \ No newline at end of file diff --git a/examples/timeouts/timeouts.hash b/examples/timeouts/timeouts.hash new file mode 100644 index 0000000..b5b732d --- /dev/null +++ b/examples/timeouts/timeouts.hash @@ -0,0 +1,2 @@ +48dc2824c813ec9195866592e4bed211fa9a5098 +CoBnJiRyx3 \ No newline at end of file diff --git a/examples/timers/timers.hash b/examples/timers/timers.hash new file mode 100644 index 0000000..aa97122 --- /dev/null +++ b/examples/timers/timers.hash @@ -0,0 +1,2 @@ +a5b44952d93152ba6bfdb100ea30cd8446cad47e +6fSHrYxpMu \ No newline at end of file diff --git a/examples/url-parsing/url-parsing.hash b/examples/url-parsing/url-parsing.hash new file mode 100644 index 0000000..3e85c30 --- /dev/null +++ b/examples/url-parsing/url-parsing.hash @@ -0,0 +1,2 @@ +677974cc6b7ba9a63f6c7f2979fd46ef2a4202d7 +eaMv0skOfY \ No newline at end of file diff --git a/examples/values/values.hash b/examples/values/values.hash new file mode 100644 index 0000000..23b4e8f --- /dev/null +++ b/examples/values/values.hash @@ -0,0 +1,2 @@ +c5a53c75cc57dc15ac4458285c9b139bf85c67bf +fgGVOyuZdu \ No newline at end of file diff --git a/examples/variables/variables.hash b/examples/variables/variables.hash new file mode 100644 index 0000000..7651804 --- /dev/null +++ b/examples/variables/variables.hash @@ -0,0 +1,2 @@ +8c74aae4850358073926dba5d98aa402f9968251 +Zv45CSMaiD \ No newline at end of file diff --git a/examples/variadic-functions/variadic-functions.hash b/examples/variadic-functions/variadic-functions.hash new file mode 100644 index 0000000..9a12e85 --- /dev/null +++ b/examples/variadic-functions/variadic-functions.hash @@ -0,0 +1,2 @@ +25bcf8d28adf0587d1959e88f32786d7f21872b2 +wRPLOM1VIH \ No newline at end of file diff --git a/examples/worker-pools/worker-pools.hash b/examples/worker-pools/worker-pools.hash new file mode 100644 index 0000000..ec7c75e --- /dev/null +++ b/examples/worker-pools/worker-pools.hash @@ -0,0 +1,2 @@ +9d5b1d008d278df7db7697d56d491d982da86e7d +y12QxBsKtT \ No newline at end of file diff --git a/examples/writing-files/writing-files.hash b/examples/writing-files/writing-files.hash new file mode 100644 index 0000000..14b965f --- /dev/null +++ b/examples/writing-files/writing-files.hash @@ -0,0 +1,2 @@ +0853ca57176872e9b34b501855ceb8bf5fbdbf46 +5usz1Oc-xY \ No newline at end of file diff --git a/public/play.png b/public/play.png new file mode 100644 index 0000000000000000000000000000000000000000..b450204efaa361506629a5d162f57b36575e0b39 GIT binary patch literal 30822 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 OhLDj^6t5OF4*DM{V>7G( literal 0 HcmV?d00001 From d61579313ace81edd3a9e2fc41bcff5073a86a84 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 08:42:34 -0700 Subject: [PATCH 04/10] just panic here for now --- tools/generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generate.go b/tools/generate.go index fc1df7b..21e427f 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -148,7 +148,7 @@ func resetUrlHashFile(codehash, code, sourcePath string) string { payload := strings.NewReader(code) resp, err := http.Post("http://play.golang.org/share", "text/plain", payload) if err != nil { - // handle error + panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) From 37028a7f0f11288e51364309c3617ab608889794 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 08:45:36 -0700 Subject: [PATCH 05/10] simplify parseHashFile --- tools/generate.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tools/generate.go b/tools/generate.go index 21e427f..22607e2 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -131,17 +131,8 @@ type Example struct { } func parseHashFile(sourcePath string) (string, string) { - var codehash, urlkey string lines := readLines(sourcePath) - for idx, line := range lines { - switch idx { - case 0: - codehash = line - case 1: - urlkey = line - } - } - return codehash, urlkey + return lines[0], lines[1] } func resetUrlHashFile(codehash, code, sourcePath string) string { From b0b6dbeb1b0afa02b9dabd27fefdde7b7f30b1b3 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 08:47:52 -0700 Subject: [PATCH 06/10] switch to if --- tools/generate.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/generate.go b/tools/generate.go index 22607e2..09b9ea9 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -230,10 +230,9 @@ func parseExamples() []*Example { example.Segs = make([][]*Seg, 0) sourcePaths := mustGlob("examples/" + exampleId + "/*") for _, sourcePath := range sourcePaths { - switch strings.HasSuffix(sourcePath, ".hash") { - case true: + if strings.HasSuffix(sourcePath, ".hash") { example.GoCodeHash, example.UrlHash = parseHashFile(sourcePath) - default: + } else { sourceSegs, filecontents := parseAndRenderSegs(sourcePath) if filecontents != "" { example.GoCode = filecontents From afdf0cc2b4b1c71161e8f3503cd37eccea83e773 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 08:50:23 -0700 Subject: [PATCH 07/10] add trailing newlines --- examples/arrays/arrays.hash | 2 +- examples/atomic-counters/atomic-counters.hash | 2 +- examples/base64-encoding/base64-encoding.hash | 2 +- examples/channel-buffering/channel-buffering.hash | 2 +- examples/channel-directions/channel-directions.hash | 2 +- examples/channel-synchronization/channel-synchronization.hash | 2 +- examples/channels/channels.hash | 2 +- examples/closing-channels/closing-channels.hash | 2 +- examples/closures/closures.hash | 2 +- examples/collection-functions/collection-functions.hash | 2 +- examples/command-line-arguments/command-line-arguments.hash | 2 +- examples/command-line-flags/command-line-flags.hash | 2 +- examples/constants/constants.hash | 2 +- examples/defer/defer.hash | 2 +- examples/environment-variables/environment-variables.hash | 2 +- examples/epoch/epoch.hash | 2 +- examples/errors/errors.hash | 2 +- examples/execing-processes/execing-processes.hash | 2 +- examples/exit/exit.hash | 2 +- examples/for/for.hash | 2 +- examples/functions/functions.hash | 2 +- examples/goroutines/goroutines.hash | 2 +- examples/hello-world/hello-world.hash | 2 +- examples/if-else/if-else.hash | 2 +- examples/interfaces/interfaces.hash | 2 +- examples/json/json.hash | 2 +- examples/line-filters/line-filters.hash | 2 +- examples/maps/maps.hash | 2 +- examples/methods/methods.hash | 2 +- examples/multiple-return-values/multiple-return-values.hash | 2 +- examples/mutexes/mutexes.hash | 2 +- .../non-blocking-channel-operations.hash | 2 +- examples/number-parsing/number-parsing.hash | 2 +- examples/panic/panic.hash | 2 +- examples/pointers/pointers.hash | 2 +- examples/random-numbers/random-numbers.hash | 2 +- examples/range-over-channels/range-over-channels.hash | 2 +- examples/range/range.hash | 2 +- examples/rate-limiting/rate-limiting.hash | 2 +- examples/reading-files/reading-files.hash | 2 +- examples/recursion/recursion.hash | 2 +- examples/regular-expressions/regular-expressions.hash | 2 +- examples/select/select.hash | 2 +- examples/sha1-hashes/sha1-hashes.hash | 2 +- examples/signals/signals.hash | 2 +- examples/slices/slices.hash | 2 +- examples/sorting-by-functions/sorting-by-functions.hash | 2 +- examples/sorting/sorting.hash | 2 +- examples/spawning-processes/spawning-processes.hash | 2 +- examples/stateful-goroutines/stateful-goroutines.hash | 2 +- examples/string-formatting/string-formatting.hash | 2 +- examples/string-functions/string-functions.hash | 2 +- examples/structs/structs.hash | 2 +- examples/switch/switch.hash | 2 +- examples/tickers/tickers.hash | 2 +- examples/time-formatting-parsing/time-formatting-parsing.hash | 2 +- examples/time/time.hash | 2 +- examples/timeouts/timeouts.hash | 2 +- examples/timers/timers.hash | 2 +- examples/url-parsing/url-parsing.hash | 2 +- examples/values/values.hash | 2 +- examples/variables/variables.hash | 2 +- examples/variadic-functions/variadic-functions.hash | 2 +- examples/worker-pools/worker-pools.hash | 2 +- examples/writing-files/writing-files.hash | 2 +- tools/generate.go | 2 +- 66 files changed, 66 insertions(+), 66 deletions(-) diff --git a/examples/arrays/arrays.hash b/examples/arrays/arrays.hash index 8829b48..516ae70 100644 --- a/examples/arrays/arrays.hash +++ b/examples/arrays/arrays.hash @@ -1,2 +1,2 @@ 305975d13d24223181d13f042b290906d86c1a0e -l-A8eBnwio \ No newline at end of file +l-A8eBnwio diff --git a/examples/atomic-counters/atomic-counters.hash b/examples/atomic-counters/atomic-counters.hash index 29cdd11..c62b86e 100644 --- a/examples/atomic-counters/atomic-counters.hash +++ b/examples/atomic-counters/atomic-counters.hash @@ -1,2 +1,2 @@ 97f1f28e352163cb841fb26dc05dced9fa8efde5 -sKIaNsJquU \ No newline at end of file +sKIaNsJquU diff --git a/examples/base64-encoding/base64-encoding.hash b/examples/base64-encoding/base64-encoding.hash index eb57a13..25e1653 100644 --- a/examples/base64-encoding/base64-encoding.hash +++ b/examples/base64-encoding/base64-encoding.hash @@ -1,2 +1,2 @@ e57f5be3a796261fb4a55cdb0580a254e14b4930 -t6rFm2x4Yr \ No newline at end of file +t6rFm2x4Yr diff --git a/examples/channel-buffering/channel-buffering.hash b/examples/channel-buffering/channel-buffering.hash index 75f737f..c82a990 100644 --- a/examples/channel-buffering/channel-buffering.hash +++ b/examples/channel-buffering/channel-buffering.hash @@ -1,2 +1,2 @@ 122140f7ad1bc5cff4fcd7a9e7245b87aaca3ec5 -34PVHwO6Bn \ No newline at end of file +34PVHwO6Bn diff --git a/examples/channel-directions/channel-directions.hash b/examples/channel-directions/channel-directions.hash index b79f6f2..e881c47 100644 --- a/examples/channel-directions/channel-directions.hash +++ b/examples/channel-directions/channel-directions.hash @@ -1,2 +1,2 @@ 635cc13dfe33123ac188e01e3002d3aa935d765f -P9Fujfpa1f \ No newline at end of file +P9Fujfpa1f diff --git a/examples/channel-synchronization/channel-synchronization.hash b/examples/channel-synchronization/channel-synchronization.hash index 0365d99..8680448 100644 --- a/examples/channel-synchronization/channel-synchronization.hash +++ b/examples/channel-synchronization/channel-synchronization.hash @@ -1,2 +1,2 @@ fe3e2ea1a67d0f95ce4cb18f3e8aa16d416de0ce -0DfW-1RMqi \ No newline at end of file +0DfW-1RMqi diff --git a/examples/channels/channels.hash b/examples/channels/channels.hash index 93cb176..0d8c963 100644 --- a/examples/channels/channels.hash +++ b/examples/channels/channels.hash @@ -1,2 +1,2 @@ be6689b44773c1f7a83d409d1e2f5ba7d6c7b006 -aVTMoY5FNt \ No newline at end of file +aVTMoY5FNt diff --git a/examples/closing-channels/closing-channels.hash b/examples/closing-channels/closing-channels.hash index 04f044b..b6f3076 100644 --- a/examples/closing-channels/closing-channels.hash +++ b/examples/closing-channels/closing-channels.hash @@ -1,2 +1,2 @@ 5205898a520533e46ea24c849848d19ebc2d08a9 -eFZ2SeKswH \ No newline at end of file +eFZ2SeKswH diff --git a/examples/closures/closures.hash b/examples/closures/closures.hash index 6e0c5cc..a1f8255 100644 --- a/examples/closures/closures.hash +++ b/examples/closures/closures.hash @@ -1,2 +1,2 @@ 2e062d01989caada16c4b22ff6a35cd58e4eb819 -gQtEWkhWyp \ No newline at end of file +gQtEWkhWyp diff --git a/examples/collection-functions/collection-functions.hash b/examples/collection-functions/collection-functions.hash index 442b559..cab1518 100644 --- a/examples/collection-functions/collection-functions.hash +++ b/examples/collection-functions/collection-functions.hash @@ -1,2 +1,2 @@ ed54b3fc0512ccace0f3d0b74975c9bcd2e7a8a2 -3PNdke3Wia \ No newline at end of file +3PNdke3Wia diff --git a/examples/command-line-arguments/command-line-arguments.hash b/examples/command-line-arguments/command-line-arguments.hash index 0fec98d..4fd8561 100644 --- a/examples/command-line-arguments/command-line-arguments.hash +++ b/examples/command-line-arguments/command-line-arguments.hash @@ -1,2 +1,2 @@ 41c970a1ef29ad2a05307e6c783ff52ab80eaccd -44uyYt_TRl \ No newline at end of file +44uyYt_TRl diff --git a/examples/command-line-flags/command-line-flags.hash b/examples/command-line-flags/command-line-flags.hash index f61c676..03cb054 100644 --- a/examples/command-line-flags/command-line-flags.hash +++ b/examples/command-line-flags/command-line-flags.hash @@ -1,2 +1,2 @@ a22c44511e84451cca813659f3803fb7ae48dab0 -9xlvGqQjhl \ No newline at end of file +9xlvGqQjhl diff --git a/examples/constants/constants.hash b/examples/constants/constants.hash index 1d4f27d..b5ab256 100644 --- a/examples/constants/constants.hash +++ b/examples/constants/constants.hash @@ -1,2 +1,2 @@ 3de4f16f1ed032378268411b2173b95e8000305d -T5sj0eINnp \ No newline at end of file +T5sj0eINnp diff --git a/examples/defer/defer.hash b/examples/defer/defer.hash index e8e6ae7..726cb8c 100644 --- a/examples/defer/defer.hash +++ b/examples/defer/defer.hash @@ -1,2 +1,2 @@ 570699fc50a1d39e9d0ad6a4461aef3248b080e1 -9aoHwzHcAo \ No newline at end of file +9aoHwzHcAo diff --git a/examples/environment-variables/environment-variables.hash b/examples/environment-variables/environment-variables.hash index b4b5b15..ef39f96 100644 --- a/examples/environment-variables/environment-variables.hash +++ b/examples/environment-variables/environment-variables.hash @@ -1,2 +1,2 @@ 4d0832c5a1ddd4e95474791e8802c15452358214 -kfqLhpmEpw \ No newline at end of file +kfqLhpmEpw diff --git a/examples/epoch/epoch.hash b/examples/epoch/epoch.hash index 8628834..95cd863 100644 --- a/examples/epoch/epoch.hash +++ b/examples/epoch/epoch.hash @@ -1,2 +1,2 @@ b56f9122928886ac695c15657c2ff5ec7c5436d9 -3jXHvYbLUz \ No newline at end of file +3jXHvYbLUz diff --git a/examples/errors/errors.hash b/examples/errors/errors.hash index 43f7825..aceb00c 100644 --- a/examples/errors/errors.hash +++ b/examples/errors/errors.hash @@ -1,2 +1,2 @@ 07cffb3d4e37162ab7e9e0a192561ddc8042b81a -BmDQXkPPTk \ No newline at end of file +BmDQXkPPTk diff --git a/examples/execing-processes/execing-processes.hash b/examples/execing-processes/execing-processes.hash index 132068d..9267a36 100644 --- a/examples/execing-processes/execing-processes.hash +++ b/examples/execing-processes/execing-processes.hash @@ -1,2 +1,2 @@ ae75526fdd970c450fa3ed52c70cf400a45d0770 -iEAD2cYC-h \ No newline at end of file +iEAD2cYC-h diff --git a/examples/exit/exit.hash b/examples/exit/exit.hash index 220c28b..cb4c6a9 100644 --- a/examples/exit/exit.hash +++ b/examples/exit/exit.hash @@ -1,2 +1,2 @@ dc0bb3eaafa045d6aa05e88aff39322a1ccf822e -CDiAh9SXRM \ No newline at end of file +CDiAh9SXRM diff --git a/examples/for/for.hash b/examples/for/for.hash index a3dd2ba..954a23c 100644 --- a/examples/for/for.hash +++ b/examples/for/for.hash @@ -1,2 +1,2 @@ e7dbd5f44ea79a3eb41e4535575197b9eadc0e03 -mGqqcBZ0jv \ No newline at end of file +mGqqcBZ0jv diff --git a/examples/functions/functions.hash b/examples/functions/functions.hash index 92aacbc..98b77eb 100644 --- a/examples/functions/functions.hash +++ b/examples/functions/functions.hash @@ -1,2 +1,2 @@ 19cac21e4a057e8335ce78a30de9a43c2b18d522 -2EXoOWfGf_ \ No newline at end of file +2EXoOWfGf_ diff --git a/examples/goroutines/goroutines.hash b/examples/goroutines/goroutines.hash index 60c5e96..b2bce9e 100644 --- a/examples/goroutines/goroutines.hash +++ b/examples/goroutines/goroutines.hash @@ -1,2 +1,2 @@ 5562eb9bebe9ed442e8fa6801fab86b00fd1d2ba -aIO_Wi3hJj \ No newline at end of file +aIO_Wi3hJj diff --git a/examples/hello-world/hello-world.hash b/examples/hello-world/hello-world.hash index 9b91757..dd889b9 100644 --- a/examples/hello-world/hello-world.hash +++ b/examples/hello-world/hello-world.hash @@ -1,2 +1,2 @@ 66ef79aa3cbc8789c141ce7031fb3f493e003aad -H8bxSpw9Jq \ No newline at end of file +H8bxSpw9Jq diff --git a/examples/if-else/if-else.hash b/examples/if-else/if-else.hash index 8576ed7..a1981ed 100644 --- a/examples/if-else/if-else.hash +++ b/examples/if-else/if-else.hash @@ -1,2 +1,2 @@ 4187a4268be1cd85fdd6e9a211d1e4f534666ad6 -p_ykufAYRj \ No newline at end of file +p_ykufAYRj diff --git a/examples/interfaces/interfaces.hash b/examples/interfaces/interfaces.hash index abea922..2f3f3db 100644 --- a/examples/interfaces/interfaces.hash +++ b/examples/interfaces/interfaces.hash @@ -1,2 +1,2 @@ 853be73c5685a0510da77c22c64727afa7fb0581 -vx8bwC-Bmq \ No newline at end of file +vx8bwC-Bmq diff --git a/examples/json/json.hash b/examples/json/json.hash index 4b169ec..2b57c3a 100644 --- a/examples/json/json.hash +++ b/examples/json/json.hash @@ -1,2 +1,2 @@ 12f985bb444e2bd6d72ea52a24ebc5f4f82c5b9b -4L2wMVv7tW \ No newline at end of file +4L2wMVv7tW diff --git a/examples/line-filters/line-filters.hash b/examples/line-filters/line-filters.hash index c0d2f9a..c5c6dc4 100644 --- a/examples/line-filters/line-filters.hash +++ b/examples/line-filters/line-filters.hash @@ -1,2 +1,2 @@ fe6d70a3115bd0974aa6f3f8444bb539d17fc027 -OSS71nSpkV \ No newline at end of file +OSS71nSpkV diff --git a/examples/maps/maps.hash b/examples/maps/maps.hash index 1465005..34d7452 100644 --- a/examples/maps/maps.hash +++ b/examples/maps/maps.hash @@ -1,2 +1,2 @@ 572365c80895f32241032397bd69094886892d90 -D-F9YN_V8r \ No newline at end of file +D-F9YN_V8r diff --git a/examples/methods/methods.hash b/examples/methods/methods.hash index 4309922..bcb0099 100644 --- a/examples/methods/methods.hash +++ b/examples/methods/methods.hash @@ -1,2 +1,2 @@ 24cfb9ad45e43c2d49163149bc55925a4e1b3c7a -254m_9Yjwa \ No newline at end of file +254m_9Yjwa diff --git a/examples/multiple-return-values/multiple-return-values.hash b/examples/multiple-return-values/multiple-return-values.hash index c7abd5a..f746983 100644 --- a/examples/multiple-return-values/multiple-return-values.hash +++ b/examples/multiple-return-values/multiple-return-values.hash @@ -1,2 +1,2 @@ 9e0a75102d83565fefbf1893728b15633dc44a2c -LrDt1Wah0M \ No newline at end of file +LrDt1Wah0M diff --git a/examples/mutexes/mutexes.hash b/examples/mutexes/mutexes.hash index 2d3d757..221d44d 100644 --- a/examples/mutexes/mutexes.hash +++ b/examples/mutexes/mutexes.hash @@ -1,2 +1,2 @@ a42e6b574ab2c2bdd38df53d77b9a2f3f3e0b10c --_LKNceBru \ No newline at end of file +-_LKNceBru diff --git a/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash b/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash index 8e78305..3bca2a4 100644 --- a/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash +++ b/examples/non-blocking-channel-operations/non-blocking-channel-operations.hash @@ -1,2 +1,2 @@ 119ced4df4f79795b163483b6abfd855e76ef577 -M972dltae2 \ No newline at end of file +M972dltae2 diff --git a/examples/number-parsing/number-parsing.hash b/examples/number-parsing/number-parsing.hash index 6c02da7..714860f 100644 --- a/examples/number-parsing/number-parsing.hash +++ b/examples/number-parsing/number-parsing.hash @@ -1,2 +1,2 @@ 0d2155e9863a73c098d44637e92403d7f5e8e965 -N90EppECFk \ No newline at end of file +N90EppECFk diff --git a/examples/panic/panic.hash b/examples/panic/panic.hash index e10b4de..5c411f6 100644 --- a/examples/panic/panic.hash +++ b/examples/panic/panic.hash @@ -1,2 +1,2 @@ 91639bbcfcc6ed088295a9ee6b1c36ab35ae402a -c86oXzfQOt \ No newline at end of file +c86oXzfQOt diff --git a/examples/pointers/pointers.hash b/examples/pointers/pointers.hash index dc14689..6cb7efd 100644 --- a/examples/pointers/pointers.hash +++ b/examples/pointers/pointers.hash @@ -1,2 +1,2 @@ 85cff3345d2f22b65a5d54eb8f7aa8f508f27887 -KdE4TBbUL2 \ No newline at end of file +KdE4TBbUL2 diff --git a/examples/random-numbers/random-numbers.hash b/examples/random-numbers/random-numbers.hash index 5f7c74d..bedcd90 100644 --- a/examples/random-numbers/random-numbers.hash +++ b/examples/random-numbers/random-numbers.hash @@ -1,2 +1,2 @@ 62b0562c92dd84ecb9408df4c517031d75b1e337 -C0_kuFx3ET \ No newline at end of file +C0_kuFx3ET diff --git a/examples/range-over-channels/range-over-channels.hash b/examples/range-over-channels/range-over-channels.hash index 88af611..b707556 100644 --- a/examples/range-over-channels/range-over-channels.hash +++ b/examples/range-over-channels/range-over-channels.hash @@ -1,2 +1,2 @@ e415b1f2ae531b319bb9aca69b17e7b916511744 -WN7NNh9tvh \ No newline at end of file +WN7NNh9tvh diff --git a/examples/range/range.hash b/examples/range/range.hash index 8ca87df..6c3be57 100644 --- a/examples/range/range.hash +++ b/examples/range/range.hash @@ -1,2 +1,2 @@ e6458150862a6b26e95629ba6a90a6a3036d7d52 -Ys3V-ohVRy \ No newline at end of file +Ys3V-ohVRy diff --git a/examples/rate-limiting/rate-limiting.hash b/examples/rate-limiting/rate-limiting.hash index 6cbaac8..3eaf668 100644 --- a/examples/rate-limiting/rate-limiting.hash +++ b/examples/rate-limiting/rate-limiting.hash @@ -1,2 +1,2 @@ d74aebb12f618f22ec776eb5b4de92985104c197 -e7yzIk97-p \ No newline at end of file +e7yzIk97-p diff --git a/examples/reading-files/reading-files.hash b/examples/reading-files/reading-files.hash index 6141596..d39e052 100644 --- a/examples/reading-files/reading-files.hash +++ b/examples/reading-files/reading-files.hash @@ -1,2 +1,2 @@ 251ab050de24051bb7d9858940421fdec41fa674 -VcLqpSwnkN \ No newline at end of file +VcLqpSwnkN diff --git a/examples/recursion/recursion.hash b/examples/recursion/recursion.hash index 0967049..b867f04 100644 --- a/examples/recursion/recursion.hash +++ b/examples/recursion/recursion.hash @@ -1,2 +1,2 @@ 5d1ba6b03a50ccae2a0f46865eb72c587e11857c -RFn-rf42ap \ No newline at end of file +RFn-rf42ap diff --git a/examples/regular-expressions/regular-expressions.hash b/examples/regular-expressions/regular-expressions.hash index fa96776..98a545e 100644 --- a/examples/regular-expressions/regular-expressions.hash +++ b/examples/regular-expressions/regular-expressions.hash @@ -1,2 +1,2 @@ 0ebd0a44997fe20d3fa0caa8b5f2cfa96ff1db13 -7bnr2EXlxK \ No newline at end of file +7bnr2EXlxK diff --git a/examples/select/select.hash b/examples/select/select.hash index f55c050..758358e 100644 --- a/examples/select/select.hash +++ b/examples/select/select.hash @@ -1,2 +1,2 @@ 572ae309be3d0fd9b029aeb908013b2914a36734 -NGSkDrli6L \ No newline at end of file +NGSkDrli6L diff --git a/examples/sha1-hashes/sha1-hashes.hash b/examples/sha1-hashes/sha1-hashes.hash index eed7392..081d3d7 100644 --- a/examples/sha1-hashes/sha1-hashes.hash +++ b/examples/sha1-hashes/sha1-hashes.hash @@ -1,2 +1,2 @@ 6a896270e34f2696b881a8fa7e68bfff57dee51f -YUaWWEeB4U \ No newline at end of file +YUaWWEeB4U diff --git a/examples/signals/signals.hash b/examples/signals/signals.hash index 9fe5134..f5a3787 100644 --- a/examples/signals/signals.hash +++ b/examples/signals/signals.hash @@ -1,2 +1,2 @@ 42ec8f6064228f89f97e2798150d741317d2bf05 -d42wO1q1oh \ No newline at end of file +d42wO1q1oh diff --git a/examples/slices/slices.hash b/examples/slices/slices.hash index c5f0317..68bb6a1 100644 --- a/examples/slices/slices.hash +++ b/examples/slices/slices.hash @@ -1,2 +1,2 @@ d900c3b1cf2bd96591f7ad7ce7fd9e592ec31139 -dPQErsP6Yc \ No newline at end of file +dPQErsP6Yc diff --git a/examples/sorting-by-functions/sorting-by-functions.hash b/examples/sorting-by-functions/sorting-by-functions.hash index 300641a..d2b00d7 100644 --- a/examples/sorting-by-functions/sorting-by-functions.hash +++ b/examples/sorting-by-functions/sorting-by-functions.hash @@ -1,2 +1,2 @@ 9b184444231f799b9388037d8142613a598e9345 -M06NADP985 \ No newline at end of file +M06NADP985 diff --git a/examples/sorting/sorting.hash b/examples/sorting/sorting.hash index 4c4ddf9..ffb7712 100644 --- a/examples/sorting/sorting.hash +++ b/examples/sorting/sorting.hash @@ -1,2 +1,2 @@ 4e576421f2bdbd11847c367d223bd30d0e301990 -roQOJXtqAb \ No newline at end of file +roQOJXtqAb diff --git a/examples/spawning-processes/spawning-processes.hash b/examples/spawning-processes/spawning-processes.hash index 4d9b30a..60e08a2 100644 --- a/examples/spawning-processes/spawning-processes.hash +++ b/examples/spawning-processes/spawning-processes.hash @@ -1,2 +1,2 @@ 4e31686ab1dac4fa0e3ce753a6af207c51b9b049 -utd_H-XJtC \ No newline at end of file +utd_H-XJtC diff --git a/examples/stateful-goroutines/stateful-goroutines.hash b/examples/stateful-goroutines/stateful-goroutines.hash index be922ae..a3eefdd 100644 --- a/examples/stateful-goroutines/stateful-goroutines.hash +++ b/examples/stateful-goroutines/stateful-goroutines.hash @@ -1,2 +1,2 @@ 13c5072f2ccb7afb85b8c7ea9a97f94423aef8de -2YrrJo4H6W \ No newline at end of file +2YrrJo4H6W diff --git a/examples/string-formatting/string-formatting.hash b/examples/string-formatting/string-formatting.hash index 4c2ff3d..998c0ab 100644 --- a/examples/string-formatting/string-formatting.hash +++ b/examples/string-formatting/string-formatting.hash @@ -1,2 +1,2 @@ fece72ed980c2ee55b3f1d5d8e8d83aed81dc814 -qayRuqXHym \ No newline at end of file +qayRuqXHym diff --git a/examples/string-functions/string-functions.hash b/examples/string-functions/string-functions.hash index 7fdbc50..354a324 100644 --- a/examples/string-functions/string-functions.hash +++ b/examples/string-functions/string-functions.hash @@ -1,2 +1,2 @@ 66fdf78c9be9a41e52bcf2e8b01ab95fa7753401 -COXm374QWe \ No newline at end of file +COXm374QWe diff --git a/examples/structs/structs.hash b/examples/structs/structs.hash index 136b045..9004363 100644 --- a/examples/structs/structs.hash +++ b/examples/structs/structs.hash @@ -1,2 +1,2 @@ 49cad39331ee5e9fb8d8dad99d3aff7f18a4e6d0 -OMCP5KFC10 \ No newline at end of file +OMCP5KFC10 diff --git a/examples/switch/switch.hash b/examples/switch/switch.hash index c5d2490..e6d7380 100644 --- a/examples/switch/switch.hash +++ b/examples/switch/switch.hash @@ -1,2 +1,2 @@ 1040d0721b871f78f221a0e9e4a61ea3b0e6de70 -8b5CajPcHn \ No newline at end of file +8b5CajPcHn diff --git a/examples/tickers/tickers.hash b/examples/tickers/tickers.hash index c08c31c..d0a1b54 100644 --- a/examples/tickers/tickers.hash +++ b/examples/tickers/tickers.hash @@ -1,2 +1,2 @@ 39781500e9ccbd39282e2dce5cb8003715bfe78a -U0PO7ZZU3l \ No newline at end of file +U0PO7ZZU3l diff --git a/examples/time-formatting-parsing/time-formatting-parsing.hash b/examples/time-formatting-parsing/time-formatting-parsing.hash index aa78838..81cf2af 100644 --- a/examples/time-formatting-parsing/time-formatting-parsing.hash +++ b/examples/time-formatting-parsing/time-formatting-parsing.hash @@ -1,2 +1,2 @@ 89dedeb30079f7f5f42202c249609c570563a1ae -JqNGqbuqF1 \ No newline at end of file +JqNGqbuqF1 diff --git a/examples/time/time.hash b/examples/time/time.hash index 819dcfc..4783733 100644 --- a/examples/time/time.hash +++ b/examples/time/time.hash @@ -1,2 +1,2 @@ a5fb723728be749919194acf860f483a7c2329c7 -NxuQTlVA2l \ No newline at end of file +NxuQTlVA2l diff --git a/examples/timeouts/timeouts.hash b/examples/timeouts/timeouts.hash index b5b732d..3981e0e 100644 --- a/examples/timeouts/timeouts.hash +++ b/examples/timeouts/timeouts.hash @@ -1,2 +1,2 @@ 48dc2824c813ec9195866592e4bed211fa9a5098 -CoBnJiRyx3 \ No newline at end of file +CoBnJiRyx3 diff --git a/examples/timers/timers.hash b/examples/timers/timers.hash index aa97122..911fc88 100644 --- a/examples/timers/timers.hash +++ b/examples/timers/timers.hash @@ -1,2 +1,2 @@ a5b44952d93152ba6bfdb100ea30cd8446cad47e -6fSHrYxpMu \ No newline at end of file +6fSHrYxpMu diff --git a/examples/url-parsing/url-parsing.hash b/examples/url-parsing/url-parsing.hash index 3e85c30..f90f79f 100644 --- a/examples/url-parsing/url-parsing.hash +++ b/examples/url-parsing/url-parsing.hash @@ -1,2 +1,2 @@ 677974cc6b7ba9a63f6c7f2979fd46ef2a4202d7 -eaMv0skOfY \ No newline at end of file +eaMv0skOfY diff --git a/examples/values/values.hash b/examples/values/values.hash index 23b4e8f..7343a3c 100644 --- a/examples/values/values.hash +++ b/examples/values/values.hash @@ -1,2 +1,2 @@ c5a53c75cc57dc15ac4458285c9b139bf85c67bf -fgGVOyuZdu \ No newline at end of file +fgGVOyuZdu diff --git a/examples/variables/variables.hash b/examples/variables/variables.hash index 7651804..8e7c623 100644 --- a/examples/variables/variables.hash +++ b/examples/variables/variables.hash @@ -1,2 +1,2 @@ 8c74aae4850358073926dba5d98aa402f9968251 -Zv45CSMaiD \ No newline at end of file +Zv45CSMaiD diff --git a/examples/variadic-functions/variadic-functions.hash b/examples/variadic-functions/variadic-functions.hash index 9a12e85..95ad82d 100644 --- a/examples/variadic-functions/variadic-functions.hash +++ b/examples/variadic-functions/variadic-functions.hash @@ -1,2 +1,2 @@ 25bcf8d28adf0587d1959e88f32786d7f21872b2 -wRPLOM1VIH \ No newline at end of file +wRPLOM1VIH diff --git a/examples/worker-pools/worker-pools.hash b/examples/worker-pools/worker-pools.hash index ec7c75e..09eb260 100644 --- a/examples/worker-pools/worker-pools.hash +++ b/examples/worker-pools/worker-pools.hash @@ -1,2 +1,2 @@ 9d5b1d008d278df7db7697d56d491d982da86e7d -y12QxBsKtT \ No newline at end of file +y12QxBsKtT diff --git a/examples/writing-files/writing-files.hash b/examples/writing-files/writing-files.hash index 14b965f..16a7fd6 100644 --- a/examples/writing-files/writing-files.hash +++ b/examples/writing-files/writing-files.hash @@ -1,2 +1,2 @@ 0853ca57176872e9b34b501855ceb8bf5fbdbf46 -5usz1Oc-xY \ No newline at end of file +5usz1Oc-xY diff --git a/tools/generate.go b/tools/generate.go index 09b9ea9..4f1cc13 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -144,7 +144,7 @@ func resetUrlHashFile(codehash, code, sourcePath string) string { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) urlkey := string(body) - data := fmt.Sprintf("%s\n%s", codehash, urlkey) + data := fmt.Sprintf("%s\n%s\n", codehash, urlkey) ioutil.WriteFile(sourcePath, []byte(data), 0644) return urlkey } From 96e55fd1ba883054bf699cee8c4b6187c97bf44c Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 09:03:31 -0700 Subject: [PATCH 08/10] use the gopher logo --- README.md | 5 ++++- public/play.png | Bin 30822 -> 739 bytes templates/play.png | Bin 30822 -> 739 bytes 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b35f4c..c8706d9 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,10 @@ $ heroku open -r $DEPLOY ### License -This work is licensed under a +This work is copyright Mark McGranaghan and licensed under a +[Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/). + +The Go Gopher is copyright the Go Authors and licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/). diff --git a/public/play.png b/public/play.png index b450204efaa361506629a5d162f57b36575e0b39..ec7028cc111e97129b9067aebd500df2bde39f0a 100644 GIT binary patch literal 739 zcmV<90v!E`P)5r00004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!bxA})R4C75 z`2YVu12XRD=wJYXlpqh=OR33;AA*B}UK(mCKQh->duC%}qk^s;g|leUVrG3k-8nPc zi~jFjJ@r2bw6t~nZzzoaUy$JcKPf5M2CD(7si_Q6(J>5iQevxj?%45v>Xb?UYjb1% z@7=xg|B(ZG{vTY`|NrRfzW)xk))ff}i3~9@F{lPGF)=zyi3zT#%a8s4@x%N7Cr_XK zZ*6Y$-^Ehr|H{c#|F7?!^Z(wVMgJ2*+-?a8i!wPlIG`H9$HP@+Z?5-z<>c!ByH`y9 zzkBt}|81p-|4RyT{%>8-{{PC(S^qEZoc(|M{FeV#mKM2@QBkM{00Aoy8)e4$zP^8W z;r~n9rvo+2`oC>a_y04Srh?fZLvHV%|Gy+F?msWTKs&ktU?3{QKl$vIY5yJnp=TC;hqGCQPL-mgjk1hcR;ElcW z{@(>AB9I}4$sw317i&h4F&-L0Un?elPj`gKWtyz`+sgn!T*A! zpf?IKVhiNuKJa`yvcws48XwH#AKhFo7+}@e}6|HR}dtosHn(LUtf=6005gz V0=~sP!p;By002ovPDHLkV1h=gV>SQ) literal 30822 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 OhLDj^6t5OF4*DM{V>7G( diff --git a/templates/play.png b/templates/play.png index b450204efaa361506629a5d162f57b36575e0b39..ec7028cc111e97129b9067aebd500df2bde39f0a 100644 GIT binary patch literal 739 zcmV<90v!E`P)5r00004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!bxA})R4C75 z`2YVu12XRD=wJYXlpqh=OR33;AA*B}UK(mCKQh->duC%}qk^s;g|leUVrG3k-8nPc zi~jFjJ@r2bw6t~nZzzoaUy$JcKPf5M2CD(7si_Q6(J>5iQevxj?%45v>Xb?UYjb1% z@7=xg|B(ZG{vTY`|NrRfzW)xk))ff}i3~9@F{lPGF)=zyi3zT#%a8s4@x%N7Cr_XK zZ*6Y$-^Ehr|H{c#|F7?!^Z(wVMgJ2*+-?a8i!wPlIG`H9$HP@+Z?5-z<>c!ByH`y9 zzkBt}|81p-|4RyT{%>8-{{PC(S^qEZoc(|M{FeV#mKM2@QBkM{00Aoy8)e4$zP^8W z;r~n9rvo+2`oC>a_y04Srh?fZLvHV%|Gy+F?msWTKs&ktU?3{QKl$vIY5yJnp=TC;hqGCQPL-mgjk1hcR;ElcW z{@(>AB9I}4$sw317i&h4F&-L0Un?elPj`gKWtyz`+sgn!T*A! zpf?IKVhiNuKJa`yvcws48XwH#AKhFo7+}@e}6|HR}dtosHn(LUtf=6005gz V0=~sP!p;By002ovPDHLkV1h=gV>SQ) literal 30822 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 OhLDj^6t5OF4*DM{V>7G( From a8bd1b25dafde4c29cfe92cf513903b0aed43059 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 09:06:29 -0700 Subject: [PATCH 09/10] move image placement styling to css --- public/arrays | 2 +- public/atomic-counters | 2 +- public/base64-encoding | 2 +- public/channel-buffering | 2 +- public/channel-directions | 2 +- public/channel-synchronization | 2 +- public/channels | 2 +- public/closing-channels | 2 +- public/closures | 2 +- public/collection-functions | 2 +- public/command-line-arguments | 2 +- public/command-line-flags | 2 +- public/constants | 2 +- public/defer | 2 +- public/environment-variables | 2 +- public/epoch | 2 +- public/errors | 2 +- public/execing-processes | 2 +- public/exit | 2 +- public/for | 2 +- public/functions | 2 +- public/goroutines | 2 +- public/hello-world | 2 +- public/if-else | 2 +- public/interfaces | 2 +- public/json | 2 +- public/line-filters | 2 +- public/maps | 2 +- public/methods | 2 +- public/multiple-return-values | 2 +- public/mutexes | 2 +- public/non-blocking-channel-operations | 2 +- public/number-parsing | 2 +- public/panic | 2 +- public/pointers | 2 +- public/random-numbers | 2 +- public/range | 2 +- public/range-over-channels | 2 +- public/rate-limiting | 2 +- public/reading-files | 2 +- public/recursion | 2 +- public/regular-expressions | 2 +- public/select | 2 +- public/sha1-hashes | 2 +- public/signals | 2 +- public/site.css | 5 +++++ public/slices | 2 +- public/sorting | 2 +- public/sorting-by-functions | 2 +- public/spawning-processes | 2 +- public/stateful-goroutines | 2 +- public/string-formatting | 2 +- public/string-functions | 2 +- public/structs | 2 +- public/switch | 2 +- public/tickers | 2 +- public/time | 2 +- public/time-formatting-parsing | 2 +- public/timeouts | 2 +- public/timers | 2 +- public/url-parsing | 2 +- public/values | 2 +- public/variables | 2 +- public/variadic-functions | 2 +- public/worker-pools | 2 +- public/writing-files | 2 +- templates/example.tmpl | 2 +- templates/site.css | 5 +++++ 68 files changed, 76 insertions(+), 66 deletions(-) diff --git a/public/arrays b/public/arrays index be2b767..97cc19e 100644 --- a/public/arrays +++ b/public/arrays @@ -20,7 +20,7 @@

Go by Example: Arrays

- +
diff --git a/public/atomic-counters b/public/atomic-counters index 466792e..9049976 100644 --- a/public/atomic-counters +++ b/public/atomic-counters @@ -20,7 +20,7 @@

Go by Example: Atomic Counters

- +
diff --git a/public/base64-encoding b/public/base64-encoding index e997ded..0a565dc 100644 --- a/public/base64-encoding +++ b/public/base64-encoding @@ -20,7 +20,7 @@

Go by Example: Base64 Encoding

- +
diff --git a/public/channel-buffering b/public/channel-buffering index db69708..afff1d0 100644 --- a/public/channel-buffering +++ b/public/channel-buffering @@ -20,7 +20,7 @@

Go by Example: Channel Buffering

- +
diff --git a/public/channel-directions b/public/channel-directions index 85b7891..6b94688 100644 --- a/public/channel-directions +++ b/public/channel-directions @@ -20,7 +20,7 @@

Go by Example: Channel Directions

- +
diff --git a/public/channel-synchronization b/public/channel-synchronization index b45c984..011169f 100644 --- a/public/channel-synchronization +++ b/public/channel-synchronization @@ -20,7 +20,7 @@

Go by Example: Channel Synchronization

- +
diff --git a/public/channels b/public/channels index 19d1dea..83656f1 100644 --- a/public/channels +++ b/public/channels @@ -20,7 +20,7 @@

Go by Example: Channels

- +
diff --git a/public/closing-channels b/public/closing-channels index f7f754b..2a7fa83 100644 --- a/public/closing-channels +++ b/public/closing-channels @@ -20,7 +20,7 @@

Go by Example: Closing Channels

- +
diff --git a/public/closures b/public/closures index a61523b..2e1372c 100644 --- a/public/closures +++ b/public/closures @@ -20,7 +20,7 @@

Go by Example: Closures

- +
diff --git a/public/collection-functions b/public/collection-functions index 805114d..c8b070e 100644 --- a/public/collection-functions +++ b/public/collection-functions @@ -20,7 +20,7 @@

Go by Example: Collection Functions

- +
diff --git a/public/command-line-arguments b/public/command-line-arguments index c54f7b8..6d80fed 100644 --- a/public/command-line-arguments +++ b/public/command-line-arguments @@ -20,7 +20,7 @@

Go by Example: Command-Line Arguments

- +
diff --git a/public/command-line-flags b/public/command-line-flags index 216812d..cf2ca8a 100644 --- a/public/command-line-flags +++ b/public/command-line-flags @@ -20,7 +20,7 @@

Go by Example: Command-Line Flags

- +
diff --git a/public/constants b/public/constants index e282270..73053dc 100644 --- a/public/constants +++ b/public/constants @@ -20,7 +20,7 @@

Go by Example: Constants

- +
diff --git a/public/defer b/public/defer index 0ae3203..95462ed 100644 --- a/public/defer +++ b/public/defer @@ -20,7 +20,7 @@

Go by Example: Defer

- +
diff --git a/public/environment-variables b/public/environment-variables index 1ee4f90..63ebeca 100644 --- a/public/environment-variables +++ b/public/environment-variables @@ -20,7 +20,7 @@

Go by Example: Environment Variables

- +
diff --git a/public/epoch b/public/epoch index 9d57b2d..cc5161b 100644 --- a/public/epoch +++ b/public/epoch @@ -20,7 +20,7 @@

Go by Example: Epoch

- +
diff --git a/public/errors b/public/errors index 385df4e..dc25155 100644 --- a/public/errors +++ b/public/errors @@ -20,7 +20,7 @@

Go by Example: Errors

- +
diff --git a/public/execing-processes b/public/execing-processes index ffd0a53..2700243 100644 --- a/public/execing-processes +++ b/public/execing-processes @@ -20,7 +20,7 @@

Go by Example: Exec'ing Processes

- +
diff --git a/public/exit b/public/exit index 30d016d..3b61b94 100644 --- a/public/exit +++ b/public/exit @@ -20,7 +20,7 @@

Go by Example: Exit

- +
diff --git a/public/for b/public/for index 6f992d1..2bb0487 100644 --- a/public/for +++ b/public/for @@ -20,7 +20,7 @@

Go by Example: For

- +
diff --git a/public/functions b/public/functions index b4b78fe..ddb42f4 100644 --- a/public/functions +++ b/public/functions @@ -20,7 +20,7 @@

Go by Example: Functions

- +
diff --git a/public/goroutines b/public/goroutines index 523848f..1b03964 100644 --- a/public/goroutines +++ b/public/goroutines @@ -20,7 +20,7 @@

Go by Example: Goroutines

- +
diff --git a/public/hello-world b/public/hello-world index 61300c0..afea790 100644 --- a/public/hello-world +++ b/public/hello-world @@ -20,7 +20,7 @@

Go by Example: Hello World

- +
diff --git a/public/if-else b/public/if-else index a60d49b..8c1ee77 100644 --- a/public/if-else +++ b/public/if-else @@ -20,7 +20,7 @@

Go by Example: If/Else

- +
diff --git a/public/interfaces b/public/interfaces index 7206a06..2c6efc6 100644 --- a/public/interfaces +++ b/public/interfaces @@ -20,7 +20,7 @@

Go by Example: Interfaces

- +
diff --git a/public/json b/public/json index 95e5e28..1928d21 100644 --- a/public/json +++ b/public/json @@ -20,7 +20,7 @@

Go by Example: JSON

- +
diff --git a/public/line-filters b/public/line-filters index 7a8fd15..51a6c3c 100644 --- a/public/line-filters +++ b/public/line-filters @@ -20,7 +20,7 @@

Go by Example: Line Filters

- +
diff --git a/public/maps b/public/maps index ca5c95a..0ddf290 100644 --- a/public/maps +++ b/public/maps @@ -20,7 +20,7 @@

Go by Example: Maps

- +
diff --git a/public/methods b/public/methods index a2536a0..701f331 100644 --- a/public/methods +++ b/public/methods @@ -20,7 +20,7 @@

Go by Example: Methods

- +
diff --git a/public/multiple-return-values b/public/multiple-return-values index 65613e4..9cdf349 100644 --- a/public/multiple-return-values +++ b/public/multiple-return-values @@ -20,7 +20,7 @@

Go by Example: Multiple Return Values

- +
diff --git a/public/mutexes b/public/mutexes index c4d79dd..c588d23 100644 --- a/public/mutexes +++ b/public/mutexes @@ -20,7 +20,7 @@

Go by Example: Mutexes

- +
diff --git a/public/non-blocking-channel-operations b/public/non-blocking-channel-operations index 3cebe83..55a6126 100644 --- a/public/non-blocking-channel-operations +++ b/public/non-blocking-channel-operations @@ -20,7 +20,7 @@

Go by Example: Non-Blocking Channel Operations

- +
diff --git a/public/number-parsing b/public/number-parsing index 934e924..b01d116 100644 --- a/public/number-parsing +++ b/public/number-parsing @@ -20,7 +20,7 @@

Go by Example: Number Parsing

- +
diff --git a/public/panic b/public/panic index e7448cd..c4ea20a 100644 --- a/public/panic +++ b/public/panic @@ -20,7 +20,7 @@

Go by Example: Panic

- +
diff --git a/public/pointers b/public/pointers index 127bf24..4f2d6ad 100644 --- a/public/pointers +++ b/public/pointers @@ -20,7 +20,7 @@

Go by Example: Pointers

- +
diff --git a/public/random-numbers b/public/random-numbers index 1ea1252..1f36a81 100644 --- a/public/random-numbers +++ b/public/random-numbers @@ -20,7 +20,7 @@

Go by Example: Random Numbers

- +
diff --git a/public/range b/public/range index 0096293..a4339c4 100644 --- a/public/range +++ b/public/range @@ -20,7 +20,7 @@

Go by Example: Range

- +
diff --git a/public/range-over-channels b/public/range-over-channels index d8507ad..2a9cf69 100644 --- a/public/range-over-channels +++ b/public/range-over-channels @@ -20,7 +20,7 @@

Go by Example: Range over Channels

- +
diff --git a/public/rate-limiting b/public/rate-limiting index f403da6..4e50cdc 100644 --- a/public/rate-limiting +++ b/public/rate-limiting @@ -20,7 +20,7 @@

Go by Example: Rate Limiting

- +
diff --git a/public/reading-files b/public/reading-files index 778f0a8..b946860 100644 --- a/public/reading-files +++ b/public/reading-files @@ -20,7 +20,7 @@

Go by Example: Reading Files

- +
diff --git a/public/recursion b/public/recursion index c849ae4..516faa2 100644 --- a/public/recursion +++ b/public/recursion @@ -20,7 +20,7 @@

Go by Example: Recursion

- +
diff --git a/public/regular-expressions b/public/regular-expressions index 522473f..ca8a19f 100644 --- a/public/regular-expressions +++ b/public/regular-expressions @@ -20,7 +20,7 @@

Go by Example: Regular Expressions

- +
diff --git a/public/select b/public/select index 5edc2ae..c4d94c9 100644 --- a/public/select +++ b/public/select @@ -20,7 +20,7 @@

Go by Example: Select

- +
diff --git a/public/sha1-hashes b/public/sha1-hashes index e08d2cd..0d0e1a9 100644 --- a/public/sha1-hashes +++ b/public/sha1-hashes @@ -20,7 +20,7 @@

Go by Example: SHA1 Hashes

- +
diff --git a/public/signals b/public/signals index 29a4c64..5ed5dbc 100644 --- a/public/signals +++ b/public/signals @@ -20,7 +20,7 @@

Go by Example: Signals

- +
diff --git a/public/site.css b/public/site.css index 1e698f4..4808e32 100644 --- a/public/site.css +++ b/public/site.css @@ -136,6 +136,11 @@ pre, code { font-size: 14px; line-height: 18px; font-family: 'Menlo', 'Monaco', 'Consolas', 'Lucida Console', monospace; } +img.run { + height: 16px; + width: 16px; + float: right +} /* Syntax highlighting */ body .hll { background-color: #ffffcc } diff --git a/public/slices b/public/slices index 1ac261d..0f282ec 100644 --- a/public/slices +++ b/public/slices @@ -20,7 +20,7 @@

Go by Example: Slices

- +
diff --git a/public/sorting b/public/sorting index ac16a99..bd380b1 100644 --- a/public/sorting +++ b/public/sorting @@ -20,7 +20,7 @@

Go by Example: Sorting

- +
diff --git a/public/sorting-by-functions b/public/sorting-by-functions index f1b172b..4b01d4f 100644 --- a/public/sorting-by-functions +++ b/public/sorting-by-functions @@ -20,7 +20,7 @@

Go by Example: Sorting by Functions

- +
diff --git a/public/spawning-processes b/public/spawning-processes index 1f42780..8279f46 100644 --- a/public/spawning-processes +++ b/public/spawning-processes @@ -20,7 +20,7 @@

Go by Example: Spawning Processes

- +
diff --git a/public/stateful-goroutines b/public/stateful-goroutines index 02ad6b7..03b2626 100644 --- a/public/stateful-goroutines +++ b/public/stateful-goroutines @@ -20,7 +20,7 @@

Go by Example: Stateful Goroutines

- +
diff --git a/public/string-formatting b/public/string-formatting index d0823d6..015b4df 100644 --- a/public/string-formatting +++ b/public/string-formatting @@ -20,7 +20,7 @@

Go by Example: String Formatting

- +
diff --git a/public/string-functions b/public/string-functions index 07e70c1..5fe25ce 100644 --- a/public/string-functions +++ b/public/string-functions @@ -20,7 +20,7 @@

Go by Example: String Functions

- +
diff --git a/public/structs b/public/structs index eab7abd..34dfc36 100644 --- a/public/structs +++ b/public/structs @@ -20,7 +20,7 @@

Go by Example: Structs

- +
diff --git a/public/switch b/public/switch index 1e583ef..e51eb62 100644 --- a/public/switch +++ b/public/switch @@ -20,7 +20,7 @@

Go by Example: Switch

- +
diff --git a/public/tickers b/public/tickers index e09ed05..7c33751 100644 --- a/public/tickers +++ b/public/tickers @@ -20,7 +20,7 @@

Go by Example: Tickers

- +
diff --git a/public/time b/public/time index ea29d17..ec48522 100644 --- a/public/time +++ b/public/time @@ -20,7 +20,7 @@

Go by Example: Time

- +
diff --git a/public/time-formatting-parsing b/public/time-formatting-parsing index 201e063..41edb34 100644 --- a/public/time-formatting-parsing +++ b/public/time-formatting-parsing @@ -20,7 +20,7 @@

Go by Example: Time Formatting / Parsing

- +
diff --git a/public/timeouts b/public/timeouts index 1547f58..7a0f185 100644 --- a/public/timeouts +++ b/public/timeouts @@ -20,7 +20,7 @@

Go by Example: Timeouts

- +
diff --git a/public/timers b/public/timers index c3726e5..e161537 100644 --- a/public/timers +++ b/public/timers @@ -20,7 +20,7 @@

Go by Example: Timers

- +
diff --git a/public/url-parsing b/public/url-parsing index 40b9d2e..aeeb426 100644 --- a/public/url-parsing +++ b/public/url-parsing @@ -20,7 +20,7 @@

Go by Example: URL Parsing

- +
diff --git a/public/values b/public/values index a77ef9f..d332548 100644 --- a/public/values +++ b/public/values @@ -20,7 +20,7 @@

Go by Example: Values

- +
diff --git a/public/variables b/public/variables index 5db31b5..abd7a7f 100644 --- a/public/variables +++ b/public/variables @@ -20,7 +20,7 @@

Go by Example: Variables

- +
diff --git a/public/variadic-functions b/public/variadic-functions index 793c97f..738256c 100644 --- a/public/variadic-functions +++ b/public/variadic-functions @@ -20,7 +20,7 @@

Go by Example: Variadic Functions

- +
diff --git a/public/worker-pools b/public/worker-pools index a13cb50..5a9fe7e 100644 --- a/public/worker-pools +++ b/public/worker-pools @@ -20,7 +20,7 @@

Go by Example: Worker Pools

- +
diff --git a/public/writing-files b/public/writing-files index 8fbeb6b..7d4f2c1 100644 --- a/public/writing-files +++ b/public/writing-files @@ -20,7 +20,7 @@

Go by Example: Writing Files

- +
diff --git a/templates/example.tmpl b/templates/example.tmpl index 66dc55d..bf048eb 100644 --- a/templates/example.tmpl +++ b/templates/example.tmpl @@ -20,7 +20,7 @@

Go by Example: {{.Name}}

- + {{range .Segs}}
{{range .}} diff --git a/templates/site.css b/templates/site.css index 1e698f4..4808e32 100644 --- a/templates/site.css +++ b/templates/site.css @@ -136,6 +136,11 @@ pre, code { font-size: 14px; line-height: 18px; font-family: 'Menlo', 'Monaco', 'Consolas', 'Lucida Console', monospace; } +img.run { + height: 16px; + width: 16px; + float: right +} /* Syntax highlighting */ body .hll { background-color: #ffffcc } From 49870a97015de0242cceee04459172868eec2524 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Sun, 6 Oct 2013 09:25:48 -0700 Subject: [PATCH 10/10] place gopher run link in top-right of rendered go source --- public/arrays | 12 ++++++++++- public/atomic-counters | 13 +++++++++++- public/base64-encoding | 11 +++++++++- public/channel-buffering | 9 +++++++- public/channel-directions | 8 ++++++- public/channel-synchronization | 11 +++++++++- public/channels | 10 ++++++++- public/closing-channels | 10 ++++++++- public/closures | 11 +++++++++- public/collection-functions | 22 ++++++++++++++++++- public/command-line-arguments | 10 ++++++++- public/command-line-flags | 18 +++++++++++++++- public/constants | 11 +++++++++- public/defer | 11 +++++++++- public/environment-variables | 10 ++++++++- public/epoch | 10 ++++++++- public/errors | 17 ++++++++++++++- public/execing-processes | 11 +++++++++- public/exit | 11 +++++++++- public/for | 10 ++++++++- public/functions | 10 ++++++++- public/goroutines | 12 ++++++++++- public/hello-world | 8 ++++++- public/if-else | 11 +++++++++- public/interfaces | 13 +++++++++++- public/json | 23 +++++++++++++++++++- public/line-filters | 12 ++++++++++- public/maps | 14 ++++++++++++- public/methods | 12 ++++++++++- public/multiple-return-values | 10 ++++++++- public/mutexes | 17 ++++++++++++++- public/non-blocking-channel-operations | 9 +++++++- public/number-parsing | 13 +++++++++++- public/panic | 10 ++++++++- public/pointers | 11 +++++++++- public/random-numbers | 13 +++++++++++- public/range | 10 ++++++++- public/range-over-channels | 9 +++++++- public/rate-limiting | 14 ++++++++++++- public/reading-files | 17 ++++++++++++++- public/recursion | 7 ++++++- public/regular-expressions | 21 ++++++++++++++++++- public/select | 10 ++++++++- public/sha1-hashes | 12 ++++++++++- public/signals | 10 ++++++++- public/slices | 18 +++++++++++++++- public/sorting | 9 +++++++- public/sorting-by-functions | 9 +++++++- public/spawning-processes | 14 ++++++++++++- public/stateful-goroutines | 16 +++++++++++++- public/string-formatting | 29 +++++++++++++++++++++++++- public/string-functions | 11 +++++++++- public/structs | 14 ++++++++++++- public/switch | 9 +++++++- public/tickers | 8 ++++++- public/time | 15 ++++++++++++- public/time-formatting-parsing | 12 ++++++++++- public/timeouts | 10 ++++++++- public/timers | 9 +++++++- public/url-parsing | 13 +++++++++++- public/values | 9 +++++++- public/variables | 11 +++++++++- public/variadic-functions | 10 ++++++++- public/worker-pools | 12 ++++++++++- public/writing-files | 18 +++++++++++++++- templates/example.tmpl | 2 +- tools/generate.go | 7 ++++--- 67 files changed, 740 insertions(+), 69 deletions(-) diff --git a/public/arrays b/public/arrays index 97cc19e..14b3c44 100644 --- a/public/arrays +++ b/public/arrays @@ -20,7 +20,6 @@

Go by Example: Arrays

-
@@ -31,6 +30,7 @@ specific length.

@@ -40,6 +40,7 @@ specific length.

diff --git a/public/atomic-counters b/public/atomic-counters index 9049976..174cc61 100644 --- a/public/atomic-counters +++ b/public/atomic-counters @@ -20,7 +20,6 @@

Go by Example: Atomic Counters

-
+
+
package main
 
@@ -51,6 +52,7 @@ specific length.

+
import "fmt"
 
@@ -62,6 +64,7 @@ specific length.

+
func main() {
 
@@ -77,6 +80,7 @@ zero-valued, which for ints means 0s.

+
    var a [5]int
     fmt.Println("emp:", a)
 
@@ -92,6 +96,7 @@ zero-valued, which for ints means 0s.

+
    a[4] = 100
     fmt.Println("set:", a)
     fmt.Println("get:", a[4])
@@ -106,6 +111,7 @@ zero-valued, which for ints means 0s.

+
    fmt.Println("len:", len(a))
 
@@ -119,6 +125,7 @@ in one line.

+
    b := [5]int{1, 2, 3, 4, 5}
     fmt.Println("dcl:", b)
 
@@ -134,6 +141,7 @@ structures.

+
    var twoD [2][3]int
     for i := 0; i < 2; i++ {
         for j := 0; j < 3; j++ {
@@ -158,6 +166,7 @@ when printed with fmt.Println.

+
$ go run arrays.go
 emp: [0 0 0 0 0]
 set: [0 0 0 0 100]
@@ -177,6 +186,7 @@ typical Go. We’ll look at slices next.

+
@@ -35,6 +34,7 @@ counters accessed by multiple goroutines.

@@ -44,6 +44,7 @@ counters accessed by multiple goroutines.

diff --git a/public/base64-encoding b/public/base64-encoding index 0a565dc..0d07525 100644 --- a/public/base64-encoding +++ b/public/base64-encoding @@ -20,7 +20,6 @@

Go by Example: Base64 Encoding

-
+
+
package main
 
@@ -55,6 +56,7 @@ counters accessed by multiple goroutines.

+
import "fmt"
 import "time"
 import "sync/atomic"
@@ -69,6 +71,7 @@ counters accessed by multiple goroutines.

+
func main() {
 
@@ -82,6 +85,7 @@ counters accessed by multiple goroutines.

+
    var ops uint64 = 0
 
@@ -96,6 +100,7 @@ once a millisecond.

+
    for i := 0; i < 50; i++ {
         go func() {
             for {
@@ -113,6 +118,7 @@ address of our ops counter with the
 
           
+
                atomic.AddUint64(&ops, 1)
 
@@ -125,6 +131,7 @@ address of our ops counter with the
+
                runtime.Gosched()
             }
         }()
@@ -140,6 +147,7 @@ address of our ops counter with the
 
           
+
    time.Sleep(time.Second)
 
@@ -157,6 +165,7 @@ fetch the value.

+
    opsFinal := atomic.LoadUint64(&ops)
     fmt.Println("ops:", opsFinal)
 }
@@ -176,6 +185,7 @@ fetch the value.

+
$ go run atomic-counters.go
 ops: 40200
 
@@ -190,6 +200,7 @@ state.

+
@@ -31,6 +30,7 @@ encoding/decoding.

@@ -40,6 +40,7 @@ encoding/decoding.

+
+
package main
 
@@ -54,6 +55,7 @@ save us some space below.

+
import b64 "encoding/base64"
 import "fmt"
 
@@ -66,6 +68,7 @@ save us some space below.

+
func main() {
 
@@ -78,6 +81,7 @@ save us some space below.

+
    data := "abc123!?$*&()'-=@~"
 
@@ -93,6 +97,7 @@ cast our string to that type.

+
    sEnc := b64.StdEncoding.EncodeToString([]byte(data))
     fmt.Println(sEnc)
 
@@ -108,6 +113,7 @@ well-formed.

+
    sDec, _ := b64.StdEncoding.DecodeString(sEnc)
     fmt.Println(string(sDec))
     fmt.Println()
@@ -123,6 +129,7 @@ format.

+
    uEnc := b64.URLEncoding.EncodeToString([]byte(data))
     fmt.Println(uEnc)
     uDec, _ := b64.URLEncoding.DecodeString(uEnc)
@@ -145,6 +152,7 @@ but they both decode to the original string as desired.

+
$ go run base64-encoding.go
 YWJjMTIzIT8kKiYoKSctPUB+
 abc123!?$*&()'-=@~
@@ -158,6 +166,7 @@ but they both decode to the original string as desired.

+
YWJjMTIzIT8kKiYoKSctPUB-
 abc123!?$*&()'-=@~
 
diff --git a/public/channel-buffering b/public/channel-buffering index afff1d0..5893c33 100644 --- a/public/channel-buffering +++ b/public/channel-buffering @@ -20,7 +20,6 @@

Go by Example: Channel Buffering

- @@ -35,6 +34,7 @@ those values.

@@ -44,6 +44,7 @@ those values.

+
+
package main
 
@@ -55,6 +56,7 @@ those values.

+
import "fmt"
 
@@ -66,6 +68,7 @@ those values.

+
func main() {
 
@@ -79,6 +82,7 @@ those values.

+
    messages := make(chan string, 2)
 
@@ -93,6 +97,7 @@ concurrent receive.

+
    messages <- "buffered"
     messages <- "channel"
 
@@ -106,6 +111,7 @@ concurrent receive.

+
    fmt.Println(<-messages)
     fmt.Println(<-messages)
 }
@@ -123,6 +129,7 @@ concurrent receive.

+
$ go run channel-buffering.go 
 buffered
 channel
diff --git a/public/channel-directions b/public/channel-directions
index 6b94688..c1171ae 100644
--- a/public/channel-directions
+++ b/public/channel-directions
@@ -20,7 +20,6 @@
   
     

Go by Example: Channel Directions

- @@ -33,6 +32,7 @@ the program.

@@ -42,6 +42,7 @@ the program.

+
+
package main
 
@@ -53,6 +54,7 @@ the program.

+
import "fmt"
 
@@ -67,6 +69,7 @@ receive on this channel.

+
func ping(pings chan<- string, msg string) {
     pings <- msg
 }
@@ -82,6 +85,7 @@ receive on this channel.

+
func pong(pings <-chan string, pongs chan<- string) {
     msg := <-pings
     pongs <- msg
@@ -96,6 +100,7 @@ receive on this channel.

+
func main() {
     pings := make(chan string, 1)
     pongs := make(chan string, 1)
@@ -117,6 +122,7 @@ receive on this channel.

+
$ go run channel-directions.go
 passed message
 
diff --git a/public/channel-synchronization b/public/channel-synchronization index 011169f..ed359f3 100644 --- a/public/channel-synchronization +++ b/public/channel-synchronization @@ -20,7 +20,6 @@

Go by Example: Channel Synchronization

- @@ -32,6 +31,7 @@ blocking receive to wait for a goroutine to finish.

@@ -41,6 +41,7 @@ blocking receive to wait for a goroutine to finish.

diff --git a/public/channels b/public/channels index 83656f1..fbb9329 100644 --- a/public/channels +++ b/public/channels @@ -20,7 +20,6 @@

Go by Example: Channels

-
+
+
package main
 
@@ -52,6 +53,7 @@ blocking receive to wait for a goroutine to finish.

+
import "fmt"
 import "time"
 
@@ -67,6 +69,7 @@ goroutine that this function’s work is done.

+
func worker(done chan bool) {
     fmt.Print("working...")
     time.Sleep(time.Second)
@@ -82,6 +85,7 @@ goroutine that this function’s work is done.

+
    done <- true
 }
 
@@ -94,6 +98,7 @@ goroutine that this function’s work is done.

+
func main() {
 
@@ -107,6 +112,7 @@ notify on.

+
    done := make(chan bool, 1)
     go worker(done)
 
@@ -121,6 +127,7 @@ worker on the channel.

+
    <-done
 }
 
@@ -137,6 +144,7 @@ worker on the channel.

+
$ go run channel-synchronization.go      
 working...done                  
 
@@ -152,6 +160,7 @@ started.

+
@@ -34,6 +33,7 @@ underly much of Go’s functionality.

@@ -43,6 +43,7 @@ underly much of Go’s functionality.

diff --git a/public/closing-channels b/public/closing-channels index 2a7fa83..c614498 100644 --- a/public/closing-channels +++ b/public/closing-channels @@ -20,7 +20,6 @@

Go by Example: Closing Channels

-
+
+
package main
 
@@ -54,6 +55,7 @@ underly much of Go’s functionality.

+
import "fmt"
 
@@ -65,6 +67,7 @@ underly much of Go’s functionality.

+
func main() {
 
@@ -78,6 +81,7 @@ Channels are typed by the values they convey.

+
    messages := make(chan string)
 
@@ -92,6 +96,7 @@ channel we made above, from a new goroutine.

+
    go func() { messages <- "ping" }()
 
@@ -106,6 +111,7 @@ we sent above and print it out.

+
    msg := <-messages
     fmt.Println(msg)
 }
@@ -126,6 +132,7 @@ channel.

+
$ go run channels.go 
 ping
 
@@ -142,6 +149,7 @@ message without having to use any other synchronization.

+
@@ -32,6 +31,7 @@ completion to the channel’s receivers.

@@ -41,6 +41,7 @@ completion to the channel’s receivers.

diff --git a/public/closures b/public/closures index 2e1372c..fcc0b6d 100644 --- a/public/closures +++ b/public/closures @@ -20,7 +20,6 @@

Go by Example: Closures

-
+
+
package main
 
@@ -52,6 +53,7 @@ completion to the channel’s receivers.

+
import "fmt"
 
@@ -67,6 +69,7 @@ the worker we’ll close the jobs channel.

+
func main() {
     jobs := make(chan int, 5)
     done := make(chan bool)
@@ -87,6 +90,7 @@ all our jobs.

+
    go func() {
         for {
             j, more := <-jobs
@@ -111,6 +115,7 @@ channel, then closes it.

+
    for j := 1; j <= 3; j++ {
         jobs <- j
         fmt.Println("sent job", j)
@@ -130,6 +135,7 @@ we saw earlier.

+
    <-done
 }
 
@@ -146,6 +152,7 @@ we saw earlier.

+
$ go run closing-channels.go 
 sent job 1
 received job 1
@@ -167,6 +174,7 @@ example: range over channels.

+
@@ -33,6 +32,7 @@ a function inline without having to name it.

@@ -42,6 +42,7 @@ a function inline without having to name it.

diff --git a/public/collection-functions b/public/collection-functions index c8b070e..e692eb7 100644 --- a/public/collection-functions +++ b/public/collection-functions @@ -20,7 +20,6 @@

Go by Example: Collection Functions

-
+
+
package main
 
@@ -53,6 +54,7 @@ a function inline without having to name it.

+
import "fmt"
 
@@ -68,6 +70,7 @@ form a closure.

+
func intSeq() func() int {
     i := 0
     return func() int {
@@ -85,6 +88,7 @@ form a closure.

+
func main() {
 
@@ -100,6 +104,7 @@ we call nextInt.

+
    nextInt := intSeq()
 
@@ -113,6 +118,7 @@ a few times.

+
    fmt.Println(nextInt())
     fmt.Println(nextInt())
     fmt.Println(nextInt())
@@ -128,6 +134,7 @@ particular function, create and test a new one.

+
    newInts := intSeq()
     fmt.Println(newInts())
 }
@@ -145,6 +152,7 @@ particular function, create and test a new one.

+
$ go run closures.go
 1
 2
@@ -162,6 +170,7 @@ recursion.

+
@@ -33,6 +32,7 @@ collection with a custom function.

@@ -47,6 +47,7 @@ your program and data types.

@@ -62,6 +63,7 @@ helper function.

@@ -71,6 +73,7 @@ helper function.

+
+
+
+
package main
 
@@ -82,6 +85,7 @@ helper function.

+
import "strings"
 import "fmt"
 
@@ -96,6 +100,7 @@ helper function.

+
func Index(vs []string, t string) int {
     for i, v := range vs {
         if v == t {
@@ -116,6 +121,7 @@ slice.

+
func Include(vs []string, t string) bool {
     return Index(vs, t) >= 0
 }
@@ -131,6 +137,7 @@ satisfies the predicate f.

+
func Any(vs []string, f func(string) bool) bool {
     for _, v := range vs {
         if f(v) {
@@ -151,6 +158,7 @@ satisfy the predicate f.

+
func All(vs []string, f func(string) bool) bool {
     for _, v := range vs {
         if !f(v) {
@@ -171,6 +179,7 @@ slice that satisfy the predicate f.

+
func Filter(vs []string, f func(string) bool) []string {
     vsf := make([]string, 0)
     for _, v := range vs {
@@ -192,6 +201,7 @@ the function f to each string in the original slice.

+
func Map(vs []string, f func(string) string) []string {
     vsm := make([]string, len(vs))
     for i, v := range vs {
@@ -209,6 +219,7 @@ the function f to each string in the original slice.

+
func main() {
 
@@ -221,6 +232,7 @@ the function f to each string in the original slice.

+
    var strs = []string{"peach", "apple", "pear", "plum"}
 
@@ -232,6 +244,7 @@ the function f to each string in the original slice.

+
    fmt.Println(Index(strs, "pear"))
 
@@ -243,6 +256,7 @@ the function f to each string in the original slice.

+
    fmt.Println(Include(strs, "grape"))
 
@@ -254,6 +268,7 @@ the function f to each string in the original slice.

+
    fmt.Println(Any(strs, func(v string) bool {
         return strings.HasPrefix(v, "p")
     }))
@@ -267,6 +282,7 @@ the function f to each string in the original slice.

+
    fmt.Println(All(strs, func(v string) bool {
         return strings.HasPrefix(v, "p")
     }))
@@ -280,6 +296,7 @@ the function f to each string in the original slice.

+
    fmt.Println(Filter(strs, func(v string) bool {
         return strings.Contains(v, "e")
     }))
@@ -296,6 +313,7 @@ type.

+
    fmt.Println(Map(strs, strings.ToUpper))
 
@@ -307,6 +325,7 @@ type.

+
}
 
@@ -322,6 +341,7 @@ type.

+
$ go run collection-functions.go 
 2
 false
diff --git a/public/command-line-arguments b/public/command-line-arguments
index 6d80fed..8067ee8 100644
--- a/public/command-line-arguments
+++ b/public/command-line-arguments
@@ -20,7 +20,6 @@
   
     

Go by Example: Command-Line Arguments

- @@ -33,6 +32,7 @@ For example, go run hello.go uses run and @@ -42,6 +42,7 @@ For example, go run hello.go uses run and diff --git a/public/command-line-flags b/public/command-line-flags index cf2ca8a..6b0bb4b 100644 --- a/public/command-line-flags +++ b/public/command-line-flags @@ -20,7 +20,6 @@

Go by Example: Command-Line Flags

-
+
+
package main
 
@@ -53,6 +54,7 @@ For example, go run hello.go uses run and
+
import "os"
 import "fmt"
 
@@ -65,6 +67,7 @@ For example, go run hello.go uses run and
+
func main() {
 
@@ -80,6 +83,7 @@ holds the arguments to the program.

+
    argsWithProg := os.Args
     argsWithoutProg := os.Args[1:]
 
@@ -93,6 +97,7 @@ holds the arguments to the program.

+
    arg := os.Args[3]
 
@@ -104,6 +109,7 @@ holds the arguments to the program.

+
    fmt.Println(argsWithProg)
     fmt.Println(argsWithoutProg)
     fmt.Println(arg)
@@ -124,6 +130,7 @@ build a binary with go build first.

+
$ go build command-line-arguments.go
 $ ./command-line-arguments a b c d
 [./command-line-arguments a b c d]       
@@ -141,6 +148,7 @@ with flags.

+
@@ -33,6 +32,7 @@ command-line flag.

@@ -42,6 +42,7 @@ command-line flag.

diff --git a/public/constants b/public/constants index 73053dc..f9c1320 100644 --- a/public/constants +++ b/public/constants @@ -20,7 +20,6 @@

Go by Example: Constants

-
+
+
package main
 
@@ -56,6 +57,7 @@ implement our example command-line program.

+
import "flag"
 import "fmt"
 
@@ -68,6 +70,7 @@ implement our example command-line program.

+
func main() {
 
@@ -85,6 +88,7 @@ we’ll see how to use this pointer below.

+
    wordPtr := flag.String("word", "foo", "a string")
 
@@ -98,6 +102,7 @@ similar approach to the word flag.

+
    numbPtr := flag.Int("numb", 42, "an int")
     boolPtr := flag.Bool("fork", false, "a bool")
 
@@ -114,6 +119,7 @@ declaration function.

+
    var svar string
     flag.StringVar(&svar, "svar", "bar", "a string var")
 
@@ -128,6 +134,7 @@ to execute the command-line parsing.

+
    flag.Parse()
 
@@ -143,6 +150,7 @@ to get the actual option values.

+
    fmt.Println("word:", *wordPtr)
     fmt.Println("numb:", *numbPtr)
     fmt.Println("fork:", *boolPtr)
@@ -166,6 +174,7 @@ binary directly.

+
$ go build command-line-flags.go
 
@@ -179,6 +188,7 @@ all flags.

+
$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
 word: opt
 numb: 7
@@ -197,6 +207,7 @@ their default values.

+
$ ./command-line-flags -word=opt
 word: opt
 numb: 42
@@ -215,6 +226,7 @@ any flags.

+
$ ./command-line-flags -word=opt a1 a2 a3
 word: opt
 ...
@@ -232,6 +244,7 @@ will be interpreted as positional arguments).

+
$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
 word: opt
 numb: 42
@@ -250,6 +263,7 @@ generated help text for the command-line program.

+
$ ./command-line-flags -h
 Usage of ./command-line-flags:
   -fork=false: a bool
@@ -269,6 +283,7 @@ an show the help text again.

+
$ ./command-line-flags -wat
 flag provided but not defined: -wat
 Usage of ./command-line-flags:
@@ -285,6 +300,7 @@ way to parameterize programs.

+
@@ -31,6 +30,7 @@ and numeric values.

@@ -40,6 +40,7 @@ and numeric values.

+
+
package main
 
@@ -51,6 +52,7 @@ and numeric values.

+
import "fmt"
 import "math"
 
@@ -64,6 +66,7 @@ and numeric values.

+
const s string = "constant"
 
@@ -75,6 +78,7 @@ and numeric values.

+
func main() {
     fmt.Println(s)
 
@@ -89,6 +93,7 @@ statement can.

+
    const n = 500000000
 
@@ -102,6 +107,7 @@ arbitrary precision.

+
    const d = 3e20 / n
     fmt.Println(d)
 
@@ -116,6 +122,7 @@ one, such as by an explicit cast.

+
    fmt.Println(int64(d))
 
@@ -131,6 +138,7 @@ assignment or function call. For example, here
+
    fmt.Println(math.Sin(n))
 }
 
@@ -147,6 +155,7 @@ assignment or function call. For example, here
+
$ go run constant.go 
 constant
 6e+11
diff --git a/public/defer b/public/defer
index 95462ed..130870b 100644
--- a/public/defer
+++ b/public/defer
@@ -20,7 +20,6 @@
   
     

Go by Example: Defer

- @@ -33,6 +32,7 @@ purposes of cleanup. defer is often used where e.g. @@ -42,6 +42,7 @@ purposes of cleanup. defer is often used where e.g.
+
+
package main
 
@@ -53,6 +54,7 @@ purposes of cleanup. defer is often used where e.g.
+
import "fmt"
 import "os"
 
@@ -68,6 +70,7 @@ do that with defer.

+
func main() {
 
@@ -84,6 +87,7 @@ of the enclosing function (main), after
+
    f := createFile("/tmp/defer.txt")
     defer closeFile(f)
     writeFile(f)
@@ -98,6 +102,7 @@ of the enclosing function (main), after
             
           
+
func createFile(p string) *os.File {
     fmt.Println("creating")
     f, err := os.Create(p)
@@ -116,6 +121,7 @@ of the enclosing function (main), after
             
           
+
func writeFile(f *os.File) {
     fmt.Println("writing")
     fmt.Fprintln(f, "data")
@@ -129,6 +135,7 @@ of the enclosing function (main), after
             
           
+
}
 
@@ -140,6 +147,7 @@ of the enclosing function (main), after
+
func closeFile(f *os.File) {
     fmt.Println("closing")
     f.Close()
@@ -160,6 +168,7 @@ after being written.

+
$ go run defer.go
 creating
 writing
diff --git a/public/environment-variables b/public/environment-variables
index 63ebeca..cb61053 100644
--- a/public/environment-variables
+++ b/public/environment-variables
@@ -20,7 +20,6 @@
   
     

Go by Example: Environment Variables

- @@ -33,6 +32,7 @@ Let’s look at how to set, get, and list environment variables.

@@ -42,6 +42,7 @@ Let’s look at how to set, get, and list environment variables.

+
+
package main
 
@@ -53,6 +54,7 @@ Let’s look at how to set, get, and list environment variables.

+
import "os"
 import "strings"
 import "fmt"
@@ -66,6 +68,7 @@ Let’s look at how to set, get, and list environment variables.

+
func main() {
 
@@ -81,6 +84,7 @@ environment.

+
    os.Setenv("FOO", "1")
     fmt.Println("FOO:", os.Getenv("FOO"))
     fmt.Println("BAR:", os.Getenv("BAR"))
@@ -98,6 +102,7 @@ get the key and value. Here we print all the keys.

+
    fmt.Println()
     for _, e := range os.Environ() {
         pair := strings.Split(e, "=")
@@ -121,6 +126,7 @@ value for FOO that we set in the program, but that
 
           
+
$ go run environment-variables.go
 FOO: 1
 BAR: 
@@ -136,6 +142,7 @@ particular machine.

+
TERM_PROGRAM
 PATH
 SHELL
@@ -152,6 +159,7 @@ program picks that value up.

+
$ BAR=2 go run environment-variables.go
 FOO: 1
 BAR: 2
diff --git a/public/epoch b/public/epoch
index cc5161b..9f2ec37 100644
--- a/public/epoch
+++ b/public/epoch
@@ -20,7 +20,6 @@
   
     

Go by Example: Epoch

- @@ -33,6 +32,7 @@ Here’s how to do it in Go.

@@ -42,6 +42,7 @@ Here’s how to do it in Go.

diff --git a/public/errors b/public/errors index dc25155..b07e219 100644 --- a/public/errors +++ b/public/errors @@ -20,7 +20,6 @@

Go by Example: Errors

-
+
+
package main
 
@@ -53,6 +54,7 @@ Here’s how to do it in Go.

+
import "fmt"
 import "time"
 
@@ -65,6 +67,7 @@ Here’s how to do it in Go.

+
func main() {
 
@@ -79,6 +82,7 @@ nanoseconds, respectively.

+
    now := time.Now()
     secs := now.Unix()
     nanos := now.UnixNano()
@@ -96,6 +100,7 @@ dive from nanoseconds.

+
    millis := nanos / 1000000
     fmt.Println(secs)
     fmt.Println(millis)
@@ -112,6 +117,7 @@ since the epoch into the corresponding time.

+
    fmt.Println(time.Unix(secs, 0))
     fmt.Println(time.Unix(0, nanos))
 }
@@ -129,6 +135,7 @@ since the epoch into the corresponding time.

+
$ go run epoch.go 
 2012-10-31 16:13:58.292387 +0000 UTC
 1351700038
@@ -148,6 +155,7 @@ parsing and formatting.

+
@@ -37,6 +36,7 @@ non-error tasks.

@@ -46,6 +46,7 @@ non-error tasks.

diff --git a/public/execing-processes b/public/execing-processes index 2700243..baa501a 100644 --- a/public/execing-processes +++ b/public/execing-processes @@ -20,7 +20,6 @@

Go by Example: Exec'ing Processes

-
+
+
package main
 
@@ -57,6 +58,7 @@ non-error tasks.

+
import "errors"
 import "fmt"
 
@@ -71,6 +73,7 @@ have type error, a built-in interface.

+
func f1(arg int) (int, error) {
     if arg == 42 {
 
@@ -85,6 +88,7 @@ with the given error message.

+
        return -1, errors.New("can't work with 42")
 
@@ -96,6 +100,7 @@ with the given error message.

+
    }
 
@@ -109,6 +114,7 @@ there was no error.

+
    return arg + 3, nil
 }
 
@@ -125,6 +131,7 @@ to explicitly represent an argument error.

+
type argError struct {
     arg  int
     prob string
@@ -139,6 +146,7 @@ to explicitly represent an argument error.

+
func (e *argError) Error() string {
     return fmt.Sprintf("%d - %s", e.arg, e.prob)
 }
@@ -152,6 +160,7 @@ to explicitly represent an argument error.

+
func f2(arg int) (int, error) {
     if arg == 42 {
 
@@ -167,6 +176,7 @@ fields arg and prob.

+
        return -1, &argError{arg, "can't work with it"}
     }
     return arg + 3, nil
@@ -181,6 +191,7 @@ fields arg and prob.

+
func main() {
 
@@ -196,6 +207,7 @@ idiom in Go code.

+
    for _, i := range []int{7, 42} {
         if r, e := f1(i); e != nil {
             fmt.Println("f1 failed:", e)
@@ -224,6 +236,7 @@ assertion.

+
    _, e := f2(42)
     if ae, ok := e.(*argError); ok {
         fmt.Println(ae.arg)
@@ -244,6 +257,7 @@ assertion.

+
$ go run errors.go
 f1 worked: 10
 f1 failed: can't work with 42
@@ -263,6 +277,7 @@ on the Go blog for more on error handling.

+
@@ -38,6 +37,7 @@ function.

@@ -47,6 +47,7 @@ function.

diff --git a/public/exit b/public/exit index 3b61b94..3188ddb 100644 --- a/public/exit +++ b/public/exit @@ -20,7 +20,6 @@

Go by Example: Exit

-
+
+
package main
 
@@ -58,6 +59,7 @@ function.

+
import "syscall"
 import "os"
 import "os/exec"
@@ -71,6 +73,7 @@ function.

+
func main() {
 
@@ -86,6 +89,7 @@ we’ll use exec.LookPath to find it (probably
+
    binary, lookErr := exec.LookPath("ls")
     if lookErr != nil {
         panic(lookErr)
@@ -104,6 +108,7 @@ be the program name.

+
    args := []string{"ls", "-a", "-l", "-h"}
 
@@ -118,6 +123,7 @@ environment.

+
    env := os.Environ()
 
@@ -134,6 +140,7 @@ value.

+
    execErr := syscall.Exec(binary, args, env)
     if execErr != nil {
         panic(execErr)
@@ -154,6 +161,7 @@ value.

+
$ go run execing-processes.go
 total 16
 drwxr-xr-x  4 mark 136B Oct 3 16:29 .
@@ -173,6 +181,7 @@ processes covers most use cases for fork.

+
@@ -31,6 +30,7 @@ status.

@@ -40,6 +40,7 @@ status.

@@ -119,6 +125,7 @@ will be picked up by go and printed.

diff --git a/public/for b/public/for index 2bb0487..83e76a3 100644 --- a/public/for +++ b/public/for @@ -20,7 +20,6 @@

Go by Example: For

-
+
+
package main
 
@@ -51,6 +52,7 @@ status.

+
import "fmt"
 import "os"
 
@@ -63,6 +65,7 @@ status.

+
func main() {
 
@@ -76,6 +79,7 @@ this fmt.Println will never be called.

+
    defer fmt.Println("!")
 
@@ -88,6 +92,7 @@ this fmt.Println will never be called.

+
    os.Exit(3)
 }
 
@@ -104,6 +109,7 @@ use os.Exit.

+
+
$ go run exit.go
 exit status 3
 
@@ -133,6 +140,7 @@ the status in the terminal.

+
$ go build exit.go
 $ ./exit
 $ echo $?
@@ -148,6 +156,7 @@ the status in the terminal.

+
@@ -31,6 +30,7 @@ three basic types of for loops.

@@ -40,6 +40,7 @@ three basic types of for loops.

diff --git a/public/functions b/public/functions index ddb42f4..267ae28 100644 --- a/public/functions +++ b/public/functions @@ -20,7 +20,6 @@

Go by Example: Functions

-
+
+
package main
 
@@ -51,6 +52,7 @@ three basic types of for loops.

+
import "fmt"
 
@@ -62,6 +64,7 @@ three basic types of for loops.

+
func main() {
 
@@ -74,6 +77,7 @@ three basic types of for loops.

+
    i := 1
     for i <= 3 {
         fmt.Println(i)
@@ -90,6 +94,7 @@ three basic types of for loops.

+
    for j := 7; j <= 9; j++ {
         fmt.Println(j)
     }
@@ -106,6 +111,7 @@ the enclosing function.

+
    for {
         fmt.Println("loop")
         break
@@ -125,6 +131,7 @@ the enclosing function.

+
$ go run for.go
 1
 2
@@ -146,6 +153,7 @@ structures.

+
@@ -31,6 +30,7 @@ functions with a few different examples.

@@ -40,6 +40,7 @@ functions with a few different examples.

diff --git a/public/goroutines b/public/goroutines index 1b03964..67fe18b 100644 --- a/public/goroutines +++ b/public/goroutines @@ -20,7 +20,6 @@

Go by Example: Goroutines

-
+
+
package main
 
@@ -51,6 +52,7 @@ functions with a few different examples.

+
import "fmt"
 
@@ -64,6 +66,7 @@ their sum as an int.

+
func plus(a int, b int) int {
 
@@ -78,6 +81,7 @@ expression.

+
    return a + b
 }
 
@@ -90,6 +94,7 @@ expression.

+
func main() {
 
@@ -103,6 +108,7 @@ expression.

+
    res := plus(1, 2)
     fmt.Println("1+2 =", res)
 }
@@ -120,6 +126,7 @@ expression.

+
$ go run functions.go 
 1+2 = 3
 
@@ -134,6 +141,7 @@ multiple return values, which we’ll look at next.

+
@@ -30,6 +29,7 @@ @@ -39,6 +39,7 @@ diff --git a/public/hello-world b/public/hello-world index afea790..bfb0c69 100644 --- a/public/hello-world +++ b/public/hello-world @@ -20,7 +20,6 @@

Go by Example: Hello World

-
+
+
package main
 
@@ -50,6 +51,7 @@
+
import "fmt"
 
@@ -61,6 +63,7 @@
+
func f(from string) {
     for i := 0; i < 3; i++ {
         fmt.Println(from, ":", i)
@@ -76,6 +79,7 @@
             
           
+
func main() {
 
@@ -90,6 +94,7 @@ synchronously.

+
    f("direct")
 
@@ -104,6 +109,7 @@ concurrently with the calling one.

+
    go f("goroutine")
 
@@ -117,6 +123,7 @@ function call.

+
    go func(msg string) {
         fmt.Println(msg)
     }("going")
@@ -134,6 +141,7 @@ before the program exits.

+
    var input string
     fmt.Scanln(&input)
     fmt.Println("done")
@@ -156,6 +164,7 @@ goroutines being run concurrently by the Go runtime.

+
$ go run goroutines.go
 direct : 0
 direct : 1
@@ -178,6 +187,7 @@ concurrent Go programs: channels.

+
@@ -31,6 +30,7 @@ message. Here’s the full source code.

diff --git a/public/if-else b/public/if-else index 8c1ee77..c54f82e 100644 --- a/public/if-else +++ b/public/if-else @@ -20,7 +20,6 @@

Go by Example: If/Else

-
+
package main
 
@@ -42,6 +42,7 @@ message. Here’s the full source code.

+
import "fmt"
 
@@ -53,6 +54,7 @@ message. Here’s the full source code.

+
func main() {
     fmt.Println("hello world")
 }
@@ -72,6 +74,7 @@ use go run.

+
$ go run hello-world.go
 hello world
 
@@ -86,6 +89,7 @@ binaries. We can do this using go build.

+
$ go build hello-world.go
 $ ls
 hello-world	hello-world.go
@@ -100,6 +104,7 @@ binaries. We can do this using go build.

+
$ ./hello-world
 hello world
 
@@ -114,6 +119,7 @@ learn more about the language.

+
@@ -31,6 +30,7 @@ straight-forward.

@@ -40,6 +40,7 @@ straight-forward.

@@ -139,6 +146,7 @@ in Go, but that the brackets are required.

diff --git a/public/interfaces b/public/interfaces index 2c6efc6..3330a70 100644 --- a/public/interfaces +++ b/public/interfaces @@ -20,7 +20,6 @@

Go by Example: Interfaces

-
+
+
package main
 
@@ -51,6 +52,7 @@ straight-forward.

+
import "fmt"
 
@@ -62,6 +64,7 @@ straight-forward.

+
func main() {
 
@@ -74,6 +77,7 @@ straight-forward.

+
    if 7%2 == 0 {
         fmt.Println("7 is even")
     } else {
@@ -90,6 +94,7 @@ straight-forward.

+
    if 8%4 == 0 {
         fmt.Println("8 is divisible by 4")
     }
@@ -106,6 +111,7 @@ branches.

+
    if num := 9; num < 0 {
         fmt.Println(num, "is negative")
     } else if num < 10 {
@@ -126,6 +132,7 @@ in Go, but that the brackets are required.

+
+
$ go run if-else.go 
 7 is odd
 8 is divisible by 4
@@ -156,6 +164,7 @@ for basic conditions.

+
@@ -31,6 +30,7 @@ signatures.

@@ -40,6 +40,7 @@ signatures.

diff --git a/public/json b/public/json index 1928d21..ebe459d 100644 --- a/public/json +++ b/public/json @@ -20,7 +20,6 @@

Go by Example: JSON

-
+
+
package main
 
@@ -51,6 +52,7 @@ signatures.

+
import "fmt"
 import "math"
 
@@ -64,6 +66,7 @@ signatures.

+
type geometry interface {
     area() float64
     perim() float64
@@ -80,6 +83,7 @@ signatures.

+
type square struct {
     width, height float64
 }
@@ -99,6 +103,7 @@ implement geometry on squares.

+
func (s square) area() float64 {
     return s.width * s.height
 }
@@ -116,6 +121,7 @@ implement geometry on squares.

+
func (c circle) area() float64 {
     return math.Pi * c.radius * c.radius
 }
@@ -136,6 +142,7 @@ to work on any geometry.

+
func measure(g geometry) {
     fmt.Println(g)
     fmt.Println(g.area())
@@ -151,6 +158,7 @@ to work on any geometry.

+
func main() {
     s := square{width: 3, height: 4}
     c := circle{radius: 5}
@@ -168,6 +176,7 @@ these structs as arguments to measure.

+
    measure(s)
     measure(c)
 }
@@ -185,6 +194,7 @@ these structs as arguments to measure.

+
$ go run interfaces.go
 {3 4}
 12
@@ -204,6 +214,7 @@ these structs as arguments to measure.

+
@@ -32,6 +31,7 @@ data types.

@@ -41,6 +41,7 @@ data types.

diff --git a/public/line-filters b/public/line-filters index 51a6c3c..b0dd210 100644 --- a/public/line-filters +++ b/public/line-filters @@ -20,7 +20,6 @@

Go by Example: Line Filters

-
+
+
package main
 
@@ -52,6 +53,7 @@ data types.

+
import "encoding/json"
 import "fmt"
 import "os"
@@ -67,6 +69,7 @@ decoding of custom types below.

+
type Response1 struct {
     Page   int
     Fruits []string
@@ -85,6 +88,7 @@ decoding of custom types below.

+
func main() {
 
@@ -99,6 +103,7 @@ values.

+
    bolB, _ := json.Marshal(true)
     fmt.Println(string(bolB))
 
@@ -111,6 +116,7 @@ values.

+
    intB, _ := json.Marshal(1)
     fmt.Println(string(intB))
 
@@ -123,6 +129,7 @@ values.

+
    fltB, _ := json.Marshal(2.34)
     fmt.Println(string(fltB))
 
@@ -135,6 +142,7 @@ values.

+
    strB, _ := json.Marshal("gopher")
     fmt.Println(string(strB))
 
@@ -149,6 +157,7 @@ to JSON arrays and objects as you’d expect.

+
    slcD := []string{"apple", "peach", "pear"}
     slcB, _ := json.Marshal(slcD)
     fmt.Println(string(slcB))
@@ -162,6 +171,7 @@ to JSON arrays and objects as you’d expect.

+
    mapD := map[string]int{"apple": 5, "lettuce": 7}
     mapB, _ := json.Marshal(mapD)
     fmt.Println(string(mapB))
@@ -179,6 +189,7 @@ use those names as the JSON keys.

+
    res1D := &Response1{
         Page:   1,
         Fruits: []string{"apple", "peach", "pear"}}
@@ -198,6 +209,7 @@ of such tags.

+
    res2D := &Response2{
         Page:   1,
         Fruits: []string{"apple", "peach", "pear"}}
@@ -216,6 +228,7 @@ structure.

+
    byt := []byte(`{"num":6.0,"strs":["a","b"]}`)
 
@@ -231,6 +244,7 @@ to arbitrary data types.

+
    var dat map[string]interface{}
 
@@ -244,6 +258,7 @@ associated errors.

+
    if err := json.Unmarshal(byt, &dat); err != nil {
         panic(err)
     }
@@ -262,6 +277,7 @@ the expected float64 type.

+
    num := dat["num"].(float64)
     fmt.Println(num)
 
@@ -276,6 +292,7 @@ casts.

+
    strs := dat["strs"].([]interface{})
     str1 := strs[0].(string)
     fmt.Println(str1)
@@ -294,6 +311,7 @@ data.

+
    str := `{"page": 1, "fruits": ["apple", "peach"]}`
     res := &Response2{}
     json.Unmarshal([]byte(str), &res)
@@ -314,6 +332,7 @@ stream JSON encodings directly to os.Writers like
 
           
+
    enc := json.NewEncoder(os.Stdout)
     d := map[string]int{"apple": 5, "lettuce": 7}
     enc.Encode(d)
@@ -332,6 +351,7 @@ stream JSON encodings directly to os.Writers like
             
           
+
$ go run json.go
 true
 1
@@ -361,6 +381,7 @@ for more.

+
@@ -33,6 +32,7 @@ line filters.

@@ -45,6 +45,7 @@ pattern to write your own Go line filters.

+
+
package main
 
@@ -56,6 +57,7 @@ pattern to write your own Go line filters.

+
import (
     "bufio"
     "fmt"
@@ -73,6 +75,7 @@ pattern to write your own Go line filters.

+
func main() {
 
@@ -87,6 +90,7 @@ that we’ll use to read input line-by-line.

+
    rdr := bufio.NewReader(os.Stdin)
     out := os.Stdout
 
@@ -103,6 +107,7 @@ successive input lines.

+
    for {
         switch line, err := rdr.ReadString('\n'); err {
 
@@ -118,6 +123,7 @@ error on this write as we do on the read.

+
        case nil:
             ucl := strings.ToUpper(line)
             if _, err = out.WriteString(ucl); err != nil {
@@ -136,6 +142,7 @@ end of input, so exit gracefully in that case.

+
        case io.EOF:
             os.Exit(0)
 
@@ -150,6 +157,7 @@ error and exit with non-zero status.

+
        default:
             fmt.Fprintln(os.Stderr, "error:", err)
             os.Exit(1)
@@ -172,6 +180,7 @@ lowercase lines.

+
$ echo 'hello'   > /tmp/lines
 $ echo 'filter' >> /tmp/lines
 
@@ -185,6 +194,7 @@ lowercase lines.

+
$ cat /tmp/lines | go run line-filters.go
 HELLO
 FILTER
diff --git a/public/maps b/public/maps
index 0ddf290..f08cdb9 100644
--- a/public/maps
+++ b/public/maps
@@ -20,7 +20,6 @@
   
     

Go by Example: Maps

- @@ -31,6 +30,7 @@ @@ -40,6 +40,7 @@
+
+
package main
 
@@ -51,6 +52,7 @@
+
import "fmt"
 
@@ -62,6 +64,7 @@
+
func main() {
 
@@ -75,6 +78,7 @@
+
    m := make(map[string]int)
 
@@ -88,6 +92,7 @@ syntax.

+
    m["k1"] = 7
     m["k2"] = 13
 
@@ -102,6 +107,7 @@ its key/value pairs.

+
    fmt.Println("map:", m)
 
@@ -114,6 +120,7 @@ its key/value pairs.

+
    v1 := m["k1"]
     fmt.Println("v1: ", v1)
 
@@ -128,6 +135,7 @@ pairs when called on a map.

+
    fmt.Println("len:", len(m))
 
@@ -141,6 +149,7 @@ a map.

+
    delete(m, "k2")
     fmt.Println("map:", m)
 
@@ -158,6 +167,7 @@ like 0 or "".

+
    _, prs := m["k2"]
     fmt.Println("prs:", prs)
 
@@ -172,6 +182,7 @@ the same line with this syntax.

+
    n := map[string]int{"foo": 1, "bar": 2}
     fmt.Println("map:", n)
 }
@@ -191,6 +202,7 @@ printed with fmt.Println.

+
$ go run maps.go 
 map: map[k1:7 k2:13]
 v1:  7
diff --git a/public/methods b/public/methods
index 701f331..1d2a96c 100644
--- a/public/methods
+++ b/public/methods
@@ -20,7 +20,6 @@
   
     

Go by Example: Methods

- @@ -30,6 +29,7 @@ @@ -39,6 +39,7 @@ diff --git a/public/multiple-return-values b/public/multiple-return-values index 9cdf349..d81ced5 100644 --- a/public/multiple-return-values +++ b/public/multiple-return-values @@ -20,7 +20,6 @@

Go by Example: Multiple Return Values

-
+
+
package main
 
@@ -50,6 +51,7 @@
+
import "fmt"
 
@@ -61,6 +63,7 @@
+
type rect struct {
     width, height int
 }
@@ -75,6 +78,7 @@
 
           
+
func (r *rect) area() int {
     return r.width * r.height
 }
@@ -90,6 +94,7 @@ receiver types. Here’s an example of a value receiver.

+
func (r rect) perim() int {
     return 2*r.width + 2*r.height
 }
@@ -103,6 +108,7 @@ receiver types. Here’s an example of a value receiver.

+
func main() {
     r := rect{width: 10, height: 5}
 
@@ -116,6 +122,7 @@ receiver types. Here’s an example of a value receiver.

+
    fmt.Println("area: ", r.area())
     fmt.Println("perim:", r.perim())
 
@@ -133,6 +140,7 @@ receiving struct.

+
    rp := &r
     fmt.Println("area: ", rp.area())
     fmt.Println("perim:", rp.perim())
@@ -151,6 +159,7 @@ receiving struct.

+
$ go run methods.go 
 area:  50
 perim: 30
@@ -168,6 +177,7 @@ naming related sets of methods: interfaces.

+
@@ -32,6 +31,7 @@ to return both result and error values from a function.

@@ -41,6 +41,7 @@ to return both result and error values from a function.

diff --git a/public/mutexes b/public/mutexes index c588d23..c830315 100644 --- a/public/mutexes +++ b/public/mutexes @@ -20,7 +20,6 @@

Go by Example: Mutexes

-
+
+
package main
 
@@ -52,6 +53,7 @@ to return both result and error values from a function.

+
import "fmt"
 
@@ -65,6 +67,7 @@ the function returns 2 ints.

+
func vals() (int, int) {
     return 3, 7
 }
@@ -78,6 +81,7 @@ the function returns 2 ints.

+
func main() {
 
@@ -91,6 +95,7 @@ call with multiple assignment.

+
    a, b := vals()
     fmt.Println(a)
     fmt.Println(b)
@@ -106,6 +111,7 @@ use the blank identifier _.

+
    _, c := vals()
     fmt.Println(c)
 }
@@ -123,6 +129,7 @@ use the blank identifier _.

+
$ go run multiple-return-values.go
 3
 7
@@ -139,6 +146,7 @@ feature of Go functions; we’ll look at this next.

+
@@ -33,6 +32,7 @@ to safely access data across multiple goroutines.

@@ -42,6 +42,7 @@ to safely access data across multiple goroutines.

diff --git a/public/non-blocking-channel-operations b/public/non-blocking-channel-operations index 55a6126..de4e98c 100644 --- a/public/non-blocking-channel-operations +++ b/public/non-blocking-channel-operations @@ -20,7 +20,6 @@

Go by Example: Non-Blocking Channel Operations

-
+
+
package main
 
@@ -53,6 +54,7 @@ to safely access data across multiple goroutines.

+
import (
     "fmt"
     "math/rand"
@@ -71,6 +73,7 @@ to safely access data across multiple goroutines.

+
func main() {
 
@@ -83,6 +86,7 @@ to safely access data across multiple goroutines.

+
    var state = make(map[int]int)
 
@@ -95,6 +99,7 @@ to safely access data across multiple goroutines.

+
    var mutex = &sync.Mutex{}
 
@@ -109,6 +114,7 @@ operations we perform against the state.

+
    var ops int64 = 0
 
@@ -122,6 +128,7 @@ reads against the state.

+
    for r := 0; r < 100; r++ {
         go func() {
             total := 0
@@ -142,6 +149,7 @@ the ops count.

+
                key := rand.Intn(5)
                 mutex.Lock()
                 total += state[key]
@@ -165,6 +173,7 @@ case we need to do it manually.

+
                runtime.Gosched()
             }
         }()
@@ -181,6 +190,7 @@ using the same pattern we did for reads.

+
    for w := 0; w < 10; w++ {
         go func() {
             for {
@@ -206,6 +216,7 @@ using the same pattern we did for reads.

+
    time.Sleep(time.Second)
 
@@ -218,6 +229,7 @@ using the same pattern we did for reads.

+
    opsFinal := atomic.LoadInt64(&ops)
     fmt.Println("ops:", opsFinal)
 
@@ -231,6 +243,7 @@ using the same pattern we did for reads.

+
    mutex.Lock()
     fmt.Println("state:", state)
     mutex.Unlock()
@@ -252,6 +265,7 @@ using the same pattern we did for reads.

+
$ go run mutexes.go
 ops: 3598302
 state: map[1:38 4:98 2:23 3:85 0:44]
@@ -267,6 +281,7 @@ management task using only goroutines and channels.

+
@@ -33,6 +32,7 @@ non-blocking multi-way selects.

@@ -42,6 +42,7 @@ non-blocking multi-way selects.

+
+
package main
 
@@ -53,6 +54,7 @@ non-blocking multi-way selects.

+
import "fmt"
 
@@ -64,6 +66,7 @@ non-blocking multi-way selects.

+
func main() {
     messages := make(chan string)
     signals := make(chan bool)
@@ -81,6 +84,7 @@ it will immediately take the default case.

+
    select {
     case msg := <-messages:
         fmt.Println("received message", msg)
@@ -98,6 +102,7 @@ it will immediately take the default case.

+
    msg := "hi"
     select {
     case messages <- msg:
@@ -119,6 +124,7 @@ on both messages and signals.

+
    select {
     case msg := <-messages:
         fmt.Println("received message", msg)
@@ -142,6 +148,7 @@ on both messages and signals.

+
$ go run non-blocking-channel-operations.go 
 no message received
 no message sent
diff --git a/public/number-parsing b/public/number-parsing
index b01d116..910359f 100644
--- a/public/number-parsing
+++ b/public/number-parsing
@@ -20,7 +20,6 @@
   
     

Go by Example: Number Parsing

- @@ -31,6 +30,7 @@ in many programs; here’s how to do it in Go.

@@ -40,6 +40,7 @@ in many programs; here’s how to do it in Go.

diff --git a/public/panic b/public/panic index c4ea20a..202bf66 100644 --- a/public/panic +++ b/public/panic @@ -20,7 +20,6 @@

Go by Example: Panic

-
+
+
package main
 
@@ -53,6 +54,7 @@ parsing.

+
import "strconv"
 import "fmt"
 
@@ -65,6 +67,7 @@ parsing.

+
func main() {
 
@@ -78,6 +81,7 @@ precision to parse.

+
    f, _ := strconv.ParseFloat("1.234", 64)
     fmt.Println(f)
 
@@ -93,6 +97,7 @@ bits.

+
    i, _ := strconv.ParseInt("123", 0, 64)
     fmt.Println(i)
 
@@ -106,6 +111,7 @@ bits.

+
    d, _ := strconv.ParseInt("0x1c8", 0, 64)
     fmt.Println(d)
 
@@ -119,6 +125,7 @@ bits.

+
    u, _ := strconv.ParseUint("789", 0, 64)
     fmt.Println(u)
 
@@ -133,6 +140,7 @@ bits.

+
    k, _ := strconv.Atoi("135")
     fmt.Println(k)
 
@@ -146,6 +154,7 @@ bits.

+
    _, e := strconv.Atoi("wat")
     fmt.Println(e)
 }
@@ -163,6 +172,7 @@ bits.

+
$ go run number-parsing.go 
 1.234
 123
@@ -181,6 +191,7 @@ bits.

+
@@ -33,6 +32,7 @@ aren’t prepared to handle gracefully.

@@ -42,6 +42,7 @@ aren’t prepared to handle gracefully.

diff --git a/public/pointers b/public/pointers index 4f2d6ad..bc6e8ba 100644 --- a/public/pointers +++ b/public/pointers @@ -20,7 +20,6 @@

Go by Example: Pointers

-
+
+
package main
 
@@ -53,6 +54,7 @@ aren’t prepared to handle gracefully.

+
import "os"
 
@@ -64,6 +66,7 @@ aren’t prepared to handle gracefully.

+
func main() {
 
@@ -78,6 +81,7 @@ site designed to panic.

+
    panic("a problem")
 
@@ -93,6 +97,7 @@ returns an error value that we don’t know how to
+
    _, err := os.Create("/tmp/file")
     if err != nil {
         panic(err)
@@ -115,6 +120,7 @@ a non-zero status.

+
$ go run panic.go
 panic: a problem
 
@@ -127,6 +133,7 @@ a non-zero status.

+
goroutine 1 [running]:
 main.main()
 	/.../panic.go:12 +0x47
@@ -145,6 +152,7 @@ to use error-indicating return values wherever possible.

+
@@ -32,6 +31,7 @@ within your program.

@@ -41,6 +41,7 @@ within your program.

+
+
package main
 
@@ -52,6 +53,7 @@ within your program.

+
import "fmt"
 
@@ -68,6 +70,7 @@ from the one in the calling function.

+
func zeroval(ival int) {
     ival = 0
 }
@@ -87,6 +90,7 @@ value at the referenced address.

+
func zeroptr(iptr *int) {
     *iptr = 0
 }
@@ -100,6 +104,7 @@ value at the referenced address.

+
func main() {
     i := 1
     fmt.Println("initial:", i)
@@ -113,6 +118,7 @@ value at the referenced address.

+
    zeroval(i)
     fmt.Println("zeroval:", i)
 
@@ -127,6 +133,7 @@ i.e. a pointer to i.

+
    zeroptr(&i)
     fmt.Println("zeroptr:", i)
 
@@ -140,6 +147,7 @@ i.e. a pointer to i.

+
    fmt.Println("pointer:", &i)
 }
 
@@ -159,6 +167,7 @@ the memory address for that variable.

+
$ go run pointers.go
 initial: 1
 zeroval: 1
diff --git a/public/random-numbers b/public/random-numbers
index 1f36a81..25ba951 100644
--- a/public/random-numbers
+++ b/public/random-numbers
@@ -20,7 +20,6 @@
   
     

Go by Example: Random Numbers

- @@ -32,6 +31,7 @@ generation.

@@ -41,6 +41,7 @@ generation.

diff --git a/public/range b/public/range index a4339c4..209c982 100644 --- a/public/range +++ b/public/range @@ -20,7 +20,6 @@

Go by Example: Range

-
+
+
package main
 
@@ -52,6 +53,7 @@ generation.

+
import "fmt"
 import "math/rand"
 
@@ -64,6 +66,7 @@ generation.

+
func main() {
 
@@ -77,6 +80,7 @@ generation.

+
    fmt.Print(rand.Intn(100), ",")
     fmt.Print(rand.Intn(100))
     fmt.Println()
@@ -92,6 +96,7 @@ generation.

+
    fmt.Println(rand.Float64())
 
@@ -105,6 +110,7 @@ other ranges, for example 5.0 <= f' < 10.0.

+
    fmt.Print((rand.Float64()*5)+5, ",")
     fmt.Print((rand.Float64() * 5) + 5)
     fmt.Println()
@@ -120,6 +126,7 @@ give it a well-known seed.

+
    s1 := rand.NewSource(42)
     r1 := rand.New(s1)
 
@@ -134,6 +141,7 @@ functions on the rand package.

+
    fmt.Print(r1.Intn(100), ",")
     fmt.Print(r1.Intn(100))
     fmt.Println()
@@ -149,6 +157,7 @@ produces the same sequence of random numbers.

+
    s2 := rand.NewSource(42)
     r2 := rand.New(s2)
     fmt.Print(r2.Intn(100), ",")
@@ -169,6 +178,7 @@ produces the same sequence of random numbers.

+
$ go run random-numbers.go 
 81,87
 0.6645600532184904
@@ -188,6 +198,7 @@ that Go can provide.

+
@@ -32,6 +31,7 @@ of the data structures we’ve already learned.

@@ -41,6 +41,7 @@ of the data structures we’ve already learned.

+
+
package main
 
@@ -52,6 +53,7 @@ of the data structures we’ve already learned.

+
import "fmt"
 
@@ -63,6 +65,7 @@ of the data structures we’ve already learned.

+
func main() {
 
@@ -76,6 +79,7 @@ Arrays work like this too.

+
    nums := []int{2, 3, 4}
     sum := 0
     for _, num := range nums {
@@ -97,6 +101,7 @@ the indexes though.

+
    for i, num := range nums {
         if num == 3 {
             fmt.Println("index:", i)
@@ -113,6 +118,7 @@ the indexes though.

+
    kvs := map[string]string{"a": "apple", "b": "banana"}
     for k, v := range kvs {
         fmt.Printf("%s -> %s\n", k, v)
@@ -130,6 +136,7 @@ of the rune and the second the rune itself.

+
    for i, c := range "go" {
         fmt.Println(i, c)
     }
@@ -148,6 +155,7 @@ of the rune and the second the rune itself.

+
$ go run range.go 
 sum: 9
 index: 1
diff --git a/public/range-over-channels b/public/range-over-channels
index 2a9cf69..202fb59 100644
--- a/public/range-over-channels
+++ b/public/range-over-channels
@@ -20,7 +20,6 @@
   
     

Go by Example: Range over Channels

- @@ -33,6 +32,7 @@ values received from a channel.

@@ -42,6 +42,7 @@ values received from a channel.

diff --git a/public/rate-limiting b/public/rate-limiting index 4e50cdc..7eae4fc 100644 --- a/public/rate-limiting +++ b/public/rate-limiting @@ -20,7 +20,6 @@

Go by Example: Rate Limiting

-
+
+
package main
 
@@ -53,6 +54,7 @@ values received from a channel.

+
import "fmt"
 
@@ -64,6 +66,7 @@ values received from a channel.

+
func main() {
 
@@ -76,6 +79,7 @@ values received from a channel.

+
    queue := make(chan string, 2)
     queue <- "one"
     queue <- "two"
@@ -95,6 +99,7 @@ we’d block on a 3rd receive in the loop.

+
    for elem := range queue {
         fmt.Println(elem)
     }
@@ -113,6 +118,7 @@ we’d block on a 3rd receive in the loop.

+
$ go run range-over-channels.go
 one
 two
@@ -129,6 +135,7 @@ values be received.

+
@@ -34,6 +33,7 @@ channels, and tickers.

@@ -43,6 +43,7 @@ channels, and tickers.

+
+
package main
 
@@ -54,6 +55,7 @@ channels, and tickers.

+
import "time"
 import "fmt"
 
@@ -66,6 +68,7 @@ channels, and tickers.

+
func main() {
 
@@ -81,6 +84,7 @@ same name.

+
    requests := make(chan int, 5)
     for i := 1; i <= 5; i++ {
         requests <- i
@@ -99,6 +103,7 @@ our rate limiting scheme.

+
    limiter := time.Tick(time.Millisecond * 200)
 
@@ -113,6 +118,7 @@ before serving each request, we limit ourselves to
+
    for req := range requests {
         <-limiter
         fmt.Println("request", req, time.Now())
@@ -132,6 +138,7 @@ channel will allow bursts of up to 3 events.

+
    burstyLimiter := make(chan time.Time, 3)
 
@@ -144,6 +151,7 @@ channel will allow bursts of up to 3 events.

+
    for i := 0; i < 3; i++ {
         burstyLimiter <- time.Now()
     }
@@ -159,6 +167,7 @@ value to burstyLimiter, up to its limit of 3.

+
    go func() {
         for t := range time.Tick(time.Millisecond * 200) {
             burstyLimiter <- t
@@ -177,6 +186,7 @@ of burstyLimiter.

+
    burstyRequests := make(chan int, 5)
     for i := 1; i <= 5; i++ {
         burstyRequests <- i
@@ -203,6 +213,7 @@ handled once every ~200 milliseconds as desired.

+
$ go run rate-limiting.go
 request 1 2012-10-19 00:38:18.687438 +0000 UTC
 request 2 2012-10-19 00:38:18.887471 +0000 UTC
@@ -222,6 +233,7 @@ then serve the remaining 2 with ~200ms delays each.

+
request 1 2012-10-19 00:38:20.487578 +0000 UTC
 request 2 2012-10-19 00:38:20.487645 +0000 UTC
 request 3 2012-10-19 00:38:20.487676 +0000 UTC
diff --git a/public/reading-files b/public/reading-files
index b946860..f491aff 100644
--- a/public/reading-files
+++ b/public/reading-files
@@ -20,7 +20,6 @@
   
     

Go by Example: Reading Files

- @@ -32,6 +31,7 @@ reading files.

@@ -41,6 +41,7 @@ reading files.

diff --git a/public/recursion b/public/recursion index 516faa2..295fad2 100644 --- a/public/recursion +++ b/public/recursion @@ -20,7 +20,6 @@

Go by Example: Recursion

-
+
+
package main
 
@@ -52,6 +53,7 @@ reading files.

+
import (
     "bufio"
     "fmt"
@@ -71,6 +73,7 @@ This helper will streamline our error checks below.

+
func check(e error) {
     if e != nil {
         panic(e)
@@ -86,6 +89,7 @@ This helper will streamline our error checks below.

+
func main() {
 
@@ -99,6 +103,7 @@ slurping a file’s entire contents into memory.

+
    dat, err := ioutil.ReadFile("/tmp/dat")
     check(err)
     fmt.Print(string(dat))
@@ -115,6 +120,7 @@ by Opening a file to obtain an os.File value.

+
    f, err := os.Open("/tmp/dat")
 
@@ -129,6 +135,7 @@ actually were read.

+
    b1 := make([]byte, 5)
     n1, err := f.Read(b1)
     check(err)
@@ -145,6 +152,7 @@ and Read from there.

+
    o2, err := f.Seek(6, 0)
     check(err)
     b2 := make([]byte, 2)
@@ -165,6 +173,7 @@ implemented with ReadAtLeast.

+
    o3, err := f.Seek(6, 0)
     check(err)
     b3 := make([]byte, 2)
@@ -183,6 +192,7 @@ accomplishes this.

+
    _, err = f.Seek(0, 0)
     check(err)
 
@@ -199,6 +209,7 @@ reading methods it provides.

+
    r4 := bufio.NewReader(f)
     b4, err := r4.Peek(5)
     check(err)
@@ -216,6 +227,7 @@ be scheduled immediately after Opening with
 
           
+
    f.Close()
 
@@ -227,6 +239,7 @@ be scheduled immediately after Opening with
+
}
 
@@ -242,6 +255,7 @@ be scheduled immediately after Opening with
+
$ echo "hello" > /tmp/dat
 $ echo "go" >>   /tmp/dat
 $ go run reading-files.go 
@@ -262,6 +276,7 @@ be scheduled immediately after Opening with
 
           
+
@@ -32,6 +31,7 @@ Here’s a classic factorial example.

@@ -41,6 +41,7 @@ Here’s a classic factorial example.

+
+
package main
 
@@ -52,6 +53,7 @@ Here’s a classic factorial example.

+
import "fmt"
 
@@ -65,6 +67,7 @@ base case of fact(0).

+
func fact(n int) int {
     if n == 0 {
         return 1
@@ -81,6 +84,7 @@ base case of fact(0).

+
func main() {
     fmt.Println(fact(7))
 }
@@ -98,6 +102,7 @@ base case of fact(0).

+
$ go run recursion.go 
 5040
 
diff --git a/public/regular-expressions b/public/regular-expressions index ca8a19f..dd9af01 100644 --- a/public/regular-expressions +++ b/public/regular-expressions @@ -20,7 +20,6 @@

Go by Example: Regular Expressions

- @@ -32,6 +31,7 @@ in Go.

@@ -41,6 +41,7 @@ in Go.

diff --git a/public/select b/public/select index c4d94c9..33e0bcf 100644 --- a/public/select +++ b/public/select @@ -20,7 +20,6 @@

Go by Example: Select

-
+
+
package main
 
@@ -52,6 +53,7 @@ in Go.

+
import "bytes"
 import "fmt"
 import "regexp"
@@ -65,6 +67,7 @@ in Go.

+
func main() {
 
@@ -77,6 +80,7 @@ in Go.

+
    match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
     fmt.Println(match)
 
@@ -92,6 +96,7 @@ optimized Regexp struct.

+
    r, _ := regexp.Compile("p([a-z]+)ch")
 
@@ -105,6 +110,7 @@ a match test like we saw earlier.

+
    fmt.Println(r.MatchString("peach"))
 
@@ -117,6 +123,7 @@ a match test like we saw earlier.

+
    fmt.Println(r.FindString("peach punch"))
 
@@ -131,6 +138,7 @@ matching text.

+
    fmt.Println(r.FindStringIndex("peach punch"))
 
@@ -146,6 +154,7 @@ information for both p([a-z]+)ch and ([a-z]+).

+
    fmt.Println(r.FindStringSubmatch("peach punch"))
 
@@ -159,6 +168,7 @@ indexes of matches and submatches.

+
    fmt.Println(r.FindStringSubmatchIndex("peach punch"))
 
@@ -173,6 +183,7 @@ example to find all matches for a regexp.

+
    fmt.Println(r.FindAllString("peach punch pinch", -1))
 
@@ -186,6 +197,7 @@ functions we saw above as well.

+
    fmt.Println(r.FindAllStringSubmatchIndex(
         "peach punch pinch", -1))
 
@@ -201,6 +213,7 @@ of matches.

+
    fmt.Println(r.FindAllString("peach punch pinch", 2))
 
@@ -216,6 +229,7 @@ function name.

+
    fmt.Println(r.Match([]byte("peach")))
 
@@ -231,6 +245,7 @@ constants because it has 2 return values.

+
    r = regexp.MustCompile("p([a-z]+)ch")
     fmt.Println(r)
 
@@ -245,6 +260,7 @@ subsets of strings with other values.

+
    fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))
 
@@ -258,6 +274,7 @@ text with a given function.

+
    in := []byte("a peach")
     out := r.ReplaceAllFunc(in, bytes.ToUpper)
     fmt.Println(string(out))
@@ -276,6 +293,7 @@ text with a given function.

+
$ go run regular-expressions.go 
 true
 true
@@ -302,6 +320,7 @@ the regexp package docs
 
           
+
@@ -32,6 +31,7 @@ select is powerful feature of Go.

@@ -41,6 +41,7 @@ select is powerful feature of Go.

+
+
package main
 
@@ -52,6 +53,7 @@ select is powerful feature of Go.

+
import "time"
 import "fmt"
 
@@ -64,6 +66,7 @@ select is powerful feature of Go.

+
func main() {
 
@@ -76,6 +79,7 @@ select is powerful feature of Go.

+
    c1 := make(chan string)
     c2 := make(chan string)
 
@@ -91,6 +95,7 @@ executing in concurrent goroutines.

+
    go func() {
         time.Sleep(time.Second * 1)
         c1 <- "one"
@@ -111,6 +116,7 @@ simultaneously, printing each one as it arrives.

+
    for i := 0; i < 2; i++ {
         select {
         case msg1 := <-c1:
@@ -136,6 +142,7 @@ expected.

+
$ time go run select.go 
 received one
 received two
@@ -152,6 +159,7 @@ concurrently.

+
real	0m2.245s
 
diff --git a/public/sha1-hashes b/public/sha1-hashes index 0d0e1a9..285c703 100644 --- a/public/sha1-hashes +++ b/public/sha1-hashes @@ -20,7 +20,6 @@

Go by Example: SHA1 Hashes

- @@ -35,6 +34,7 @@ compute SHA1 hashes in Go.

@@ -44,6 +44,7 @@ compute SHA1 hashes in Go.

@@ -172,6 +181,7 @@ you should carefully research diff --git a/public/signals b/public/signals index 5ed5dbc..a149a0e 100644 --- a/public/signals +++ b/public/signals @@ -20,7 +20,6 @@

Go by Example: Signals

-
+
+
package main
 
@@ -57,6 +58,7 @@ compute SHA1 hashes in Go.

+
import "crypto/sha1"
 import "fmt"
 
@@ -69,6 +71,7 @@ compute SHA1 hashes in Go.

+
func main() {
     s := "sha1 this string"
 
@@ -84,6 +87,7 @@ Here we start with a new hash.

+
    h := sha1.New()
 
@@ -97,6 +101,7 @@ use []byte(s) to coerce it to bytes.

+
    h.Write([]byte(s))
 
@@ -111,6 +116,7 @@ to an existing byte slice: it usually isn’t needed.

+
    bs := h.Sum(nil)
 
@@ -125,6 +131,7 @@ a hash results to a hex string.

+
    fmt.Println(s)
     fmt.Printf("%x\n", bs)
 }
@@ -144,6 +151,7 @@ a human-readable hex format.

+
$ go run sha1-hashes.go
 sha1 this string
 cf23df2207d99a74fbe169e3eba035e633b65d94
@@ -160,6 +168,7 @@ import crypto/md5 and use md5.New().

+
+
@@ -35,6 +34,7 @@ Here’s how to handle signals in Go with channels.

@@ -44,6 +44,7 @@ Here’s how to handle signals in Go with channels.

+
+
package main
 
@@ -55,6 +56,7 @@ Here’s how to handle signals in Go with channels.

+
import "fmt"
 import "os"
 import "os/signal"
@@ -69,6 +71,7 @@ Here’s how to handle signals in Go with channels.

+
func main() {
 
@@ -84,6 +87,7 @@ notify us when the program can exit.)

+
    sigs := make(chan os.Signal, 1)
     done := make(chan bool, 1)
 
@@ -98,6 +102,7 @@ receive notifications of the specified signals.

+
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
 
@@ -112,6 +117,7 @@ and then notify the program that it can finish.

+
    go func() {
         sig := <-sigs
         fmt.Println()
@@ -131,6 +137,7 @@ above sending a value on done) and then exit.

+
    fmt.Println("awaiting signal")
     <-done
     fmt.Println("exiting")
@@ -153,6 +160,7 @@ causing the program to print interrupt and then exit.

+
$ go run signals.go
 awaiting signal
 ^C
diff --git a/public/slices b/public/slices
index 0f282ec..e69b209 100644
--- a/public/slices
+++ b/public/slices
@@ -20,7 +20,6 @@
   
     

Go by Example: Slices

- @@ -31,6 +30,7 @@ powerful interface to sequences than arrays.

@@ -40,6 +40,7 @@ powerful interface to sequences than arrays.

@@ -273,6 +288,7 @@ Go’s other key builtin data structure: maps.

diff --git a/public/sorting b/public/sorting index bd380b1..31dd745 100644 --- a/public/sorting +++ b/public/sorting @@ -20,7 +20,6 @@

Go by Example: Sorting

-
+
+
package main
 
@@ -51,6 +52,7 @@ powerful interface to sequences than arrays.

+
import "fmt"
 
@@ -62,6 +64,7 @@ powerful interface to sequences than arrays.

+
func main() {
 
@@ -78,6 +81,7 @@ the builtin make. Here we make a slice of
+
    s := make([]string, 3)
     fmt.Println("emp:", s)
 
@@ -91,6 +95,7 @@ the builtin make. Here we make a slice of
+
    s[0] = "a"
     s[1] = "b"
     s[2] = "c"
@@ -107,6 +112,7 @@ the builtin make. Here we make a slice of
 
           
+
    fmt.Println("len:", len(s))
 
@@ -124,6 +130,7 @@ append as we may get a new slice value.

+
    s = append(s, "d")
     s = append(s, "e", "f")
     fmt.Println("apd:", s)
@@ -140,6 +147,7 @@ into c from s.

+
    c := make([]string, len(s))
     copy(c, s)
     fmt.Println("cpy:", c)
@@ -156,6 +164,7 @@ of the elements s[2], s[3], and s[4].

+
    l := s[2:5]
     fmt.Println("sl1:", l)
 
@@ -169,6 +178,7 @@ of the elements s[2], s[3], and s[4].

+
    l = s[:5]
     fmt.Println("sl2:", l)
 
@@ -182,6 +192,7 @@ of the elements s[2], s[3], and s[4].

+
    l = s[2:]
     fmt.Println("sl3:", l)
 
@@ -196,6 +207,7 @@ in a single line as well.

+
    t := []string{"g", "h", "i"}
     fmt.Println("dcl:", t)
 
@@ -211,6 +223,7 @@ vary, unlike with multi-dimensional arrays.

+
    twoD := make([][]int, 3)
     for i := 0; i < 3; i++ {
         innerLen := i + 1
@@ -237,6 +250,7 @@ they are rendered similarly by fmt.Println.

+
$ go run slices.go
 emp: [  ]
 set: [a b c]
@@ -262,6 +276,7 @@ implementation of slices in Go.

+
+
@@ -32,6 +31,7 @@ builtins first.

@@ -41,6 +41,7 @@ builtins first.

+
+
package main
 
@@ -52,6 +53,7 @@ builtins first.

+
import "fmt"
 import "sort"
 
@@ -64,6 +66,7 @@ builtins first.

+
func main() {
 
@@ -79,6 +82,7 @@ return a new one.

+
    strs := []string{"c", "a", "b"}
     sort.Strings(strs)
     fmt.Println("Strings:", strs)
@@ -93,6 +97,7 @@ return a new one.

+
    ints := []int{7, 2, 4}
     sort.Ints(ints)
     fmt.Println("Ints:   ", ints)
@@ -108,6 +113,7 @@ already in sorted order.

+
    s := sort.IntsAreSorted(ints)
     fmt.Println("Sorted: ", s)
 }
@@ -127,6 +133,7 @@ slices and true as the result of our AreSorted test.
           
+
$ go run sorting.go
 Strings: [a b c]
 Ints:    [2 4 7]
diff --git a/public/sorting-by-functions b/public/sorting-by-functions
index 4b01d4f..85af568 100644
--- a/public/sorting-by-functions
+++ b/public/sorting-by-functions
@@ -20,7 +20,6 @@
   
     

Go by Example: Sorting by Functions

- @@ -34,6 +33,7 @@ in Go.

@@ -43,6 +43,7 @@ in Go.

diff --git a/public/spawning-processes b/public/spawning-processes index 8279f46..a6d4da7 100644 --- a/public/spawning-processes +++ b/public/spawning-processes @@ -20,7 +20,6 @@

Go by Example: Spawning Processes

-
+
+
package main
 
@@ -54,6 +55,7 @@ in Go.

+
import "sort"
 import "fmt"
 
@@ -70,6 +72,7 @@ type.

+
type ByLength []string
 
@@ -88,6 +91,7 @@ we use len(s[i]) and len(s[j]) here.

+
func (s ByLength) Len() int {
     return len(s)
 }
@@ -111,6 +115,7 @@ slice.

+
func main() {
     fruits := []string{"peach", "banana", "kiwi"}
     sort.Sort(ByLength(fruits))
@@ -132,6 +137,7 @@ length, as desired.

+
$ go run sorting-by-functions.go 
 [kiwi peach banana]
 
@@ -149,6 +155,7 @@ functions.

+
@@ -35,6 +34,7 @@ of spawning processes from Go.

@@ -44,6 +44,7 @@ of spawning processes from Go.

+
+
package main
 
@@ -55,6 +56,7 @@ of spawning processes from Go.

+
import "fmt"
 import "io/ioutil"
 import "os/exec"
@@ -68,6 +70,7 @@ of spawning processes from Go.

+
func main() {
 
@@ -83,6 +86,7 @@ to represent this external process.

+
    dateCmd := exec.Command("date")
 
@@ -98,6 +102,7 @@ and collecting its output. If there were no errors,
+
    dateOut, err := dateCmd.Output()
     if err != nil {
         panic(err)
@@ -117,6 +122,7 @@ where we pipe data to the external process on its
 
           
+
    grepCmd := exec.Command("grep", "hello")
 
@@ -132,6 +138,7 @@ to exit.

+
    grepIn, _ := grepCmd.StdinPipe()
     grepOut, _ := grepCmd.StdoutPipe()
     grepCmd.Start()
@@ -154,6 +161,7 @@ exactly the same way.

+
    fmt.Println("> grep hello")
     fmt.Println(string(grepBytes))
 
@@ -172,6 +180,7 @@ option:

+
    lsCmd := exec.Command("bash", "-c", "ls -a -l -h")
     lsOut, err := lsCmd.Output()
     if err != nil {
@@ -196,6 +205,7 @@ as if we had run them directly from the command-line.

+
$ go run spawning-processes.go 
 > date
 Wed Oct 10 09:53:11 PDT 2012
@@ -209,6 +219,7 @@ as if we had run them directly from the command-line.

+
> grep hello
 hello grep
 
@@ -221,6 +232,7 @@ as if we had run them directly from the command-line.

+
> ls -a -l -h
 drwxr-xr-x  4 mark 136B Oct 3 16:29 .
 drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
diff --git a/public/stateful-goroutines b/public/stateful-goroutines
index 03b2626..485ec2f 100644
--- a/public/stateful-goroutines
+++ b/public/stateful-goroutines
@@ -20,7 +20,6 @@
   
     

Go by Example: Stateful Goroutines

- @@ -37,6 +36,7 @@ by exactly 1 goroutine.

@@ -46,6 +46,7 @@ by exactly 1 goroutine.

diff --git a/public/string-formatting b/public/string-formatting index 015b4df..9e54b0a 100644 --- a/public/string-formatting +++ b/public/string-formatting @@ -20,7 +20,6 @@

Go by Example: String Formatting

-
+
+
package main
 
@@ -57,6 +58,7 @@ by exactly 1 goroutine.

+
import (
     "fmt"
     "math/rand"
@@ -81,6 +83,7 @@ goroutine to respond.

+
type readOp struct {
     key  int
     resp chan int
@@ -100,6 +103,7 @@ goroutine to respond.

+
func main() {
 
@@ -113,6 +117,7 @@ example.

+
    var state = make(map[int]int)
 
@@ -126,6 +131,7 @@ perform.

+
    var ops int64 = 0
 
@@ -140,6 +146,7 @@ respectively.

+
    reads := make(chan *readOp)
     writes := make(chan *writeOp)
 
@@ -159,6 +166,7 @@ on the response channel resp to indicate success
+
    go func() {
         for {
             select {
@@ -185,6 +193,7 @@ result over the provided resp channel.

+
    for r := 0; r < 100; r++ {
         go func() {
             for {
@@ -209,6 +218,7 @@ approach.

+
    for w := 0; w < 10; w++ {
         go func() {
             for {
@@ -233,6 +243,7 @@ approach.

+
    time.Sleep(time.Second)
 
@@ -245,6 +256,7 @@ approach.

+
    opsFinal := atomic.LoadInt64(&ops)
     fmt.Println("ops:", opsFinal)
 }
@@ -265,6 +277,7 @@ operations per second.

+
$ go run stateful-goroutines.go
 ops: 807434
 
@@ -285,6 +298,7 @@ program.

+
@@ -32,6 +31,7 @@ common string formatting tasks.

@@ -41,6 +41,7 @@ common string formatting tasks.

+
+
package main
 
@@ -52,6 +53,7 @@ common string formatting tasks.

+
import "fmt"
 import "os"
 
@@ -64,6 +66,7 @@ common string formatting tasks.

+
type point struct {
     x, y int
 }
@@ -77,6 +80,7 @@ common string formatting tasks.

+
func main() {
 
@@ -91,6 +95,7 @@ an instance of our point struct.

+
    p := point{1, 2}
     fmt.Printf("%v\n", p)
 
@@ -105,6 +110,7 @@ include the struct’s field names.

+
    fmt.Printf("%+v\n", p)
 
@@ -119,6 +125,7 @@ would produce that value.

+
    fmt.Printf("%#v\n", p)
 
@@ -131,6 +138,7 @@ would produce that value.

+
    fmt.Printf("%T\n", p)
 
@@ -143,6 +151,7 @@ would produce that value.

+
    fmt.Printf("%t\n", true)
 
@@ -156,6 +165,7 @@ Use %d for standard, base-10 formatting.

+
    fmt.Printf("%d\n", 123)
 
@@ -168,6 +178,7 @@ Use %d for standard, base-10 formatting.

+
    fmt.Printf("%b\n", 14)
 
@@ -181,6 +192,7 @@ given integer.

+
    fmt.Printf("%c\n", 33)
 
@@ -193,6 +205,7 @@ given integer.

+
    fmt.Printf("%x\n", 456)
 
@@ -206,6 +219,7 @@ floats. For basic decimal formatting use %f.

+
    fmt.Printf("%f\n", 78.9)
 
@@ -219,6 +233,7 @@ different versions of) scientific notation.

+
    fmt.Printf("%e\n", 123400000.0)
     fmt.Printf("%E\n", 123400000.0)
 
@@ -232,6 +247,7 @@ different versions of) scientific notation.

+
    fmt.Printf("%s\n", "\"string\"")
 
@@ -244,6 +260,7 @@ different versions of) scientific notation.

+
    fmt.Printf("%q\n", "\"string\"")
 
@@ -258,6 +275,7 @@ per byte of input.

+
    fmt.Printf("%x\n", "hex this")
 
@@ -270,6 +288,7 @@ per byte of input.

+
    fmt.Printf("%p\n", &p)
 
@@ -287,6 +306,7 @@ spaces.

+
    fmt.Printf("|%6d|%6d|\n", 12, 345)
 
@@ -302,6 +322,7 @@ width.precision syntax.

+
    fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)
 
@@ -314,6 +335,7 @@ width.precision syntax.

+
    fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)
 
@@ -328,6 +350,7 @@ table-like output. For basic right-justified width.

+
    fmt.Printf("|%6s|%6s|\n", "foo", "b")
 
@@ -340,6 +363,7 @@ table-like output. For basic right-justified width.

+
    fmt.Printf("|%-6s|%-6s|\n", "foo", "b")
 
@@ -354,6 +378,7 @@ and returns a string without printing it anywhere.

+
    s := fmt.Sprintf("a %s", "string")
     fmt.Println(s)
 
@@ -368,6 +393,7 @@ and returns a string without printing it anywhere.

+
    fmt.Fprintf(os.Stderr, "an %s\n", "error")
 }
 
@@ -384,6 +410,7 @@ and returns a string without printing it anywhere.

+
$ go run string-formatting.go
 {1 2}
 {x:1 y:2}
diff --git a/public/string-functions b/public/string-functions
index 5fe25ce..6b83df4 100644
--- a/public/string-functions
+++ b/public/string-functions
@@ -20,7 +20,6 @@
   
     

Go by Example: String Functions

- @@ -32,6 +31,7 @@ to give you a sense of the package.

@@ -41,6 +41,7 @@ to give you a sense of the package.

@@ -130,6 +136,7 @@ and getting a character by index.

+
+
package main
 
@@ -52,6 +53,7 @@ to give you a sense of the package.

+
import s "strings"
 import "fmt"
 
@@ -66,6 +68,7 @@ it a lot below.

+
var p = fmt.Println
 
@@ -77,6 +80,7 @@ it a lot below.

+
func main() {
 
@@ -93,6 +97,7 @@ as the first argument to the function.

+
    p("Contains:  ", s.Contains("test", "es"))
     p("Count:     ", s.Count("test", "t"))
     p("HasPrefix: ", s.HasPrefix("test", "te"))
@@ -118,6 +123,7 @@ package docs.

+
+
    p("Len: ", len("hello"))
     p("Char:", "hello"[1])
 }
@@ -147,6 +154,7 @@ and getting a character by index.

+
$ go run string-functions.go
 Contains:   true
 Count:      2
@@ -170,6 +178,7 @@ and getting a character by index.

+
Len:  5
 Char: 101
 
diff --git a/public/structs b/public/structs index 34dfc36..7b41cd5 100644 --- a/public/structs +++ b/public/structs @@ -20,7 +20,6 @@

Go by Example: Structs

- @@ -32,6 +31,7 @@ records.

@@ -41,6 +41,7 @@ records.

+
+
package main
 
@@ -52,6 +53,7 @@ records.

+
import "fmt"
 
@@ -64,6 +66,7 @@ records.

+
type person struct {
     name string
     age  int
@@ -78,6 +81,7 @@ records.

+
func main() {
 
@@ -90,6 +94,7 @@ records.

+
    fmt.Println(person{"Bob", 20})
 
@@ -102,6 +107,7 @@ records.

+
    fmt.Println(person{name: "Alice", age: 30})
 
@@ -114,6 +120,7 @@ records.

+
    fmt.Println(person{name: "Fred"})
 
@@ -126,6 +133,7 @@ records.

+
    fmt.Println(&person{name: "Ann", age: 40})
 
@@ -138,6 +146,7 @@ records.

+
    s := person{name: "Sean", age: 50}
     fmt.Println(s.name)
 
@@ -152,6 +161,7 @@ pointers are automatically dereferenced.

+
    sp := &s
     fmt.Println(sp.age)
 
@@ -165,6 +175,7 @@ pointers are automatically dereferenced.

+
    sp.age = 51
     fmt.Println(sp.age)
 }
@@ -182,6 +193,7 @@ pointers are automatically dereferenced.

+
$ go run structs.go
 {Bob 20}
 {Alice 30}
diff --git a/public/switch b/public/switch
index e51eb62..f999571 100644
--- a/public/switch
+++ b/public/switch
@@ -20,7 +20,6 @@
   
     

Go by Example: Switch

- @@ -31,6 +30,7 @@ branches.

@@ -40,6 +40,7 @@ branches.

+
+
package main
 
@@ -51,6 +52,7 @@ branches.

+
import "fmt"
 import "time"
 
@@ -63,6 +65,7 @@ branches.

+
func main() {
 
@@ -75,6 +78,7 @@ branches.

+
    i := 2
     fmt.Print("write ", i, " as ")
     switch i {
@@ -98,6 +102,7 @@ in the same case statement. We use the optional
 
           
+
    switch time.Now().Weekday() {
     case time.Saturday, time.Sunday:
         fmt.Println("it's the weekend")
@@ -117,6 +122,7 @@ to express if/else logic. Here we also show how the
 
           
+
    t := time.Now()
     switch {
     case t.Hour() < 12:
@@ -139,6 +145,7 @@ to express if/else logic. Here we also show how the
             
           
+
$ go run switch.go 
 write 2 as two
 it's the weekend
diff --git a/public/tickers b/public/tickers
index 7c33751..48fd574 100644
--- a/public/tickers
+++ b/public/tickers
@@ -20,7 +20,6 @@
   
     

Go by Example: Tickers

- @@ -34,6 +33,7 @@ periodically until we stop it.

@@ -43,6 +43,7 @@ periodically until we stop it.

+
+
package main
 
@@ -54,6 +55,7 @@ periodically until we stop it.

+
import "time"
 import "fmt"
 
@@ -66,6 +68,7 @@ periodically until we stop it.

+
func main() {
 
@@ -81,6 +84,7 @@ the values as they arrive every 500ms.

+
    ticker := time.NewTicker(time.Millisecond * 500)
     go func() {
         for t := range ticker.C {
@@ -100,6 +104,7 @@ channel. We’ll stop ours after 1500ms.

+
    time.Sleep(time.Millisecond * 1500)
     ticker.Stop()
     fmt.Println("Ticker stopped")
@@ -120,6 +125,7 @@ before we stop it.

+
$ go run tickers.go
 Tick at 2012-09-23 11:29:56.487625 -0700 PDT
 Tick at 2012-09-23 11:29:56.988063 -0700 PDT
diff --git a/public/time b/public/time
index ec48522..76eb47c 100644
--- a/public/time
+++ b/public/time
@@ -20,7 +20,6 @@
   
     

Go by Example: Time

- @@ -31,6 +30,7 @@ here are some examples.

@@ -40,6 +40,7 @@ here are some examples.

diff --git a/public/time-formatting-parsing b/public/time-formatting-parsing index 41edb34..73cc45b 100644 --- a/public/time-formatting-parsing +++ b/public/time-formatting-parsing @@ -20,7 +20,6 @@

Go by Example: Time Formatting / Parsing

-
+
+
package main
 
@@ -51,6 +52,7 @@ here are some examples.

+
import "fmt"
 import "time"
 
@@ -63,6 +65,7 @@ here are some examples.

+
func main() {
     p := fmt.Println
 
@@ -76,6 +79,7 @@ here are some examples.

+
    now := time.Now()
     p(now)
 
@@ -91,6 +95,7 @@ with a Location, i.e. time zone.

+
    then := time.Date(
         2009, 11, 17, 20, 34, 58, 651387237, time.UTC)
     p(then)
@@ -106,6 +111,7 @@ value as expected.

+
    p(then.Year())
     p(then.Month())
     p(then.Day())
@@ -125,6 +131,7 @@ value as expected.

+
    p(then.Weekday())
 
@@ -139,6 +146,7 @@ as the second, respectively.

+
    p(then.Before(now))
     p(then.After(now))
     p(then.Equal(now))
@@ -154,6 +162,7 @@ the interval between two times.

+
    diff := now.Sub(then)
     p(diff)
 
@@ -168,6 +177,7 @@ various units.

+
    p(diff.Hours())
     p(diff.Minutes())
     p(diff.Seconds())
@@ -185,6 +195,7 @@ duration.

+
    p(then.Add(diff))
     p(then.Add(-diff))
 }
@@ -202,6 +213,7 @@ duration.

+
$ go run time.go
 2012-10-31 15:50:13.793654 +0000 UTC
 2009-11-17 20:34:58.651387237 +0000 UTC
@@ -236,6 +248,7 @@ the Unix epoch.

+
@@ -31,6 +30,7 @@ pattern-based layouts.

@@ -40,6 +40,7 @@ pattern-based layouts.

+
+
package main
 
@@ -51,6 +52,7 @@ pattern-based layouts.

+
import "fmt"
 import "time"
 
@@ -63,6 +65,7 @@ pattern-based layouts.

+
func main() {
     p := fmt.Println
 
@@ -77,6 +80,7 @@ according to RFC3339.

+
    t := time.Now()
     p(t.Format("2006-01-02T15:04:05Z07:00"))
 
@@ -95,6 +99,7 @@ formatting.

+
    p(t.Format("3:04PM"))
     p(t.Format("Mon Jan _2 15:04:05 2006"))
     p(t.Format("2006-01-02T15:04:05.999999-07:00"))
@@ -111,6 +116,7 @@ components of the time value.

+
    fmt.Printf("%d-%02d-%02dT%02d:%02d:%02d-00:00\n",
         t.Year(), t.Month(), t.Day(),
         t.Hour(), t.Minute(), t.Second())
@@ -127,6 +133,7 @@ with some of the layouts used above.

+
    withNanos := "2006-01-02T15:04:05.999999999-07:00"
     t1, e := time.Parse(
         withNanos,
@@ -147,6 +154,7 @@ explaining the parsing problem.

+
    ansic := "Mon Jan _2 15:04:05 2006"
     _, e = time.Parse(ansic, "8:41PM")
     p(e)
@@ -162,6 +170,7 @@ use for both formatting and parsing.

+
    p(t.Format(time.Kitchen))
 }
 
@@ -178,6 +187,7 @@ use for both formatting and parsing.

+
$ go run time-formatting-parsing.go 
 2012-11-02T09:35:03-07:00
 9:35AM
diff --git a/public/timeouts b/public/timeouts
index 7a0f185..e8b6567 100644
--- a/public/timeouts
+++ b/public/timeouts
@@ -20,7 +20,6 @@
   
     

Go by Example: Timeouts

- @@ -33,6 +32,7 @@ elegant thanks to channels and select.

@@ -42,6 +42,7 @@ elegant thanks to channels and select.

diff --git a/public/timers b/public/timers index e161537..77aec09 100644 --- a/public/timers +++ b/public/timers @@ -20,7 +20,6 @@

Go by Example: Timers

-
+
+
package main
 
@@ -53,6 +54,7 @@ elegant thanks to channels and select.

+
import "time"
 import "fmt"
 
@@ -65,6 +67,7 @@ elegant thanks to channels and select.

+
func main() {
 
@@ -79,6 +82,7 @@ after 2s.

+
    c1 := make(chan string, 1)
     go func() {
         time.Sleep(time.Second * 2)
@@ -100,6 +104,7 @@ if the operation takes more than the allowed 1s.

+
    select {
     case res := <-c1:
         fmt.Println(res)
@@ -118,6 +123,7 @@ from c2 will succeed and we’ll print the result.

+
    c2 := make(chan string, 1)
     go func() {
         time.Sleep(time.Second * 2)
@@ -146,6 +152,7 @@ out and the second succeeding.

+
$ go run timeouts.go 
 timeout 1
 result 2
@@ -164,6 +171,7 @@ examples of this next: timers and tickers.

+
@@ -34,6 +33,7 @@ at tickers.

@@ -43,6 +43,7 @@ at tickers.

+
+
package main
 
@@ -54,6 +55,7 @@ at tickers.

+
import "time"
 import "fmt"
 
@@ -66,6 +68,7 @@ at tickers.

+
func main() {
 
@@ -81,6 +84,7 @@ time. This timer will wait 2 seconds.

+
    timer1 := time.NewTimer(time.Second * 2)
 
@@ -95,6 +99,7 @@ expired.

+
    <-timer1.C
     fmt.Println("Timer 1 expired")
 
@@ -111,6 +116,7 @@ Here’s an example of that.

+
    timer2 := time.NewTimer(time.Second)
     go func() {
         <-timer2.C
@@ -138,6 +144,7 @@ a chance to expire.

+
$ go run timers.go
 Timer 1 expired
 Timer 2 stopped
diff --git a/public/url-parsing b/public/url-parsing
index aeeb426..b514a5e 100644
--- a/public/url-parsing
+++ b/public/url-parsing
@@ -20,7 +20,6 @@
   
     

Go by Example: URL Parsing

- @@ -31,6 +30,7 @@ Here’s how to parse URLs in Go.

@@ -40,6 +40,7 @@ Here’s how to parse URLs in Go.

+
+
package main
 
@@ -51,6 +52,7 @@ Here’s how to parse URLs in Go.

+
import "fmt"
 import "net/url"
 import "strings"
@@ -64,6 +66,7 @@ Here’s how to parse URLs in Go.

+
func main() {
 
@@ -78,6 +81,7 @@ query params, and query fragment.

+
    s := "postgres://user:pass@host.com:5432/path?k=v#f"
 
@@ -90,6 +94,7 @@ query params, and query fragment.

+
    u, err := url.Parse(s)
     if err != nil {
         panic(err)
@@ -105,6 +110,7 @@ query params, and query fragment.

+
    fmt.Println(u.Scheme)
 
@@ -119,6 +125,7 @@ values.

+
    fmt.Println(u.User)
     fmt.Println(u.User.Username())
     p, _ := u.User.Password()
@@ -136,6 +143,7 @@ the port.

+
    fmt.Println(u.Host)
     h := strings.Split(u.Host, ":")
     fmt.Println(h[0])
@@ -152,6 +160,7 @@ the #.

+
    fmt.Println(u.Path)
     fmt.Println(u.Fragment)
 
@@ -169,6 +178,7 @@ if you only want the first value.

+
    fmt.Println(u.RawQuery)
     m, _ := url.ParseQuery(u.RawQuery)
     fmt.Println(m)
@@ -190,6 +200,7 @@ pieces that we extracted.

+
$ go run url-parsing.go 
 postgres
 user:pass
diff --git a/public/values b/public/values
index d332548..aeeee0f 100644
--- a/public/values
+++ b/public/values
@@ -20,7 +20,6 @@
   
     

Go by Example: Values

- @@ -32,6 +31,7 @@ basic examples.

@@ -41,6 +41,7 @@ basic examples.

+
+
package main
 
@@ -52,6 +53,7 @@ basic examples.

+
import "fmt"
 
@@ -63,6 +65,7 @@ basic examples.

+
func main() {
 
@@ -75,6 +78,7 @@ basic examples.

+
    fmt.Println("go" + "lang")
 
@@ -87,6 +91,7 @@ basic examples.

+
    fmt.Println("1+1 =", 1+1)
     fmt.Println("7.0/3.0 =", 7.0/3.0)
 
@@ -100,6 +105,7 @@ basic examples.

+
    fmt.Println(true && false)
     fmt.Println(true || false)
     fmt.Println(!true)
@@ -118,6 +124,7 @@ basic examples.

+
$ go run values.go
 golang
 1+1 = 2
diff --git a/public/variables b/public/variables
index abd7a7f..7422d14 100644
--- a/public/variables
+++ b/public/variables
@@ -20,7 +20,6 @@
   
     

Go by Example: Variables

- @@ -32,6 +31,7 @@ calls.

@@ -41,6 +41,7 @@ calls.

+
+
package main
 
@@ -52,6 +53,7 @@ calls.

+
import "fmt"
 
@@ -63,6 +65,7 @@ calls.

+
func main() {
 
@@ -75,6 +78,7 @@ calls.

+
    var a string = "initial"
     fmt.Println(a)
 
@@ -88,6 +92,7 @@ calls.

+
    var b, c int = 1, 2
     fmt.Println(b, c)
 
@@ -101,6 +106,7 @@ calls.

+
    var d = true
     fmt.Println(d)
 
@@ -116,6 +122,7 @@ zero value for an int is 0.

+
    var e int
     fmt.Println(e)
 
@@ -131,6 +138,7 @@ initializing a variable, e.g. for
+
    f := "short"
     fmt.Println(f)
 }
@@ -148,6 +156,7 @@ initializing a variable, e.g. for
             
           
+
$ go run variables.go
 initial
 1 2
diff --git a/public/variadic-functions b/public/variadic-functions
index 738256c..653c773 100644
--- a/public/variadic-functions
+++ b/public/variadic-functions
@@ -20,7 +20,6 @@
   
     

Go by Example: Variadic Functions

- @@ -33,6 +32,7 @@ function.

@@ -42,6 +42,7 @@ function.

diff --git a/public/worker-pools b/public/worker-pools index 5a9fe7e..1471e84 100644 --- a/public/worker-pools +++ b/public/worker-pools @@ -20,7 +20,6 @@

Go by Example: Worker Pools

-
+
+
package main
 
@@ -53,6 +54,7 @@ function.

+
import "fmt"
 
@@ -66,6 +68,7 @@ of ints as arguments.

+
func sum(nums ...int) {
     fmt.Print(nums, " ")
     total := 0
@@ -84,6 +87,7 @@ of ints as arguments.

+
func main() {
 
@@ -97,6 +101,7 @@ with individual arguments.

+
    sum(1, 2)
     sum(1, 2, 3)
 
@@ -112,6 +117,7 @@ apply them to a variadic function using
+
    nums := []int{1, 2, 3, 4}
     sum(nums...)
 }
@@ -129,6 +135,7 @@ apply them to a variadic function using
             
           
+
$ go run variadic-functions.go 
 [1 2] 3
 [1 2 3] 6
@@ -145,6 +152,7 @@ to form closures, which we’ll look at next.

+
@@ -31,6 +30,7 @@ a worker pool using goroutines and channels.

@@ -40,6 +40,7 @@ a worker pool using goroutines and channels.

+
+
package main
 
@@ -51,6 +52,7 @@ a worker pool using goroutines and channels.

+
import "fmt"
 import "time"
 
@@ -68,6 +70,7 @@ simulate an expensive task.

+
func worker(id int, jobs <-chan int, results chan<- int) {
     for j := range jobs {
         fmt.Println("worker", id, "processing job", j)
@@ -85,6 +88,7 @@ simulate an expensive task.

+
func main() {
 
@@ -99,6 +103,7 @@ channels for this.

+
    jobs := make(chan int, 100)
     results := make(chan int, 100)
 
@@ -113,6 +118,7 @@ because there are no jobs yet.

+
    for w := 1; w <= 3; w++ {
         go worker(w, jobs, results)
     }
@@ -128,6 +134,7 @@ channel to indicate that’s all the work we have.

+
    for j := 1; j <= 9; j++ {
         jobs <- j
     }
@@ -143,6 +150,7 @@ channel to indicate that’s all the work we have.

+
    for a := 1; a <= 9; a++ {
         <-results
     }
@@ -165,6 +173,7 @@ there are 3 workers operating concurrently.

+
$ time go run worker-pools.go 
 worker 1 processing job 1
 worker 2 processing job 2
@@ -185,6 +194,7 @@ there are 3 workers operating concurrently.

+
real	0m3.149s
 
diff --git a/public/writing-files b/public/writing-files index 7d4f2c1..dc9f576 100644 --- a/public/writing-files +++ b/public/writing-files @@ -20,7 +20,6 @@

Go by Example: Writing Files

- @@ -31,6 +30,7 @@ ones we saw earlier for reading.

@@ -40,6 +40,7 @@ ones we saw earlier for reading.

diff --git a/templates/example.tmpl b/templates/example.tmpl index bf048eb..db3dc96 100644 --- a/templates/example.tmpl +++ b/templates/example.tmpl @@ -20,7 +20,6 @@

Go by Example: {{.Name}}

- {{range .Segs}}
+
+
package main
 
@@ -51,6 +52,7 @@ ones we saw earlier for reading.

+
import (
     "bufio"
     "fmt"
@@ -67,6 +69,7 @@ ones we saw earlier for reading.

+
func check(e error) {
     if e != nil {
         panic(e)
@@ -82,6 +85,7 @@ ones we saw earlier for reading.

+
func main() {
 
@@ -95,6 +99,7 @@ bytes) into a file.

+
    d1 := []byte("hello\ngo\n")
     err := ioutil.WriteFile("/tmp/dat1", d1, 0644)
     check(err)
@@ -109,6 +114,7 @@ bytes) into a file.

+
    f, err := os.Create("/tmp/dat2")
     check(err)
 
@@ -123,6 +129,7 @@ after opening a file.

+
    defer f.Close()
 
@@ -135,6 +142,7 @@ after opening a file.

+
    d2 := []byte{115, 111, 109, 101, 10}
     n2, err := f.Write(d2)
     check(err)
@@ -150,6 +158,7 @@ after opening a file.

+
    n3, err := f.WriteString("writes\n")
     fmt.Printf("wrote %d bytes\n", n3)
 
@@ -163,6 +172,7 @@ after opening a file.

+
    f.Sync()
 
@@ -176,6 +186,7 @@ to the buffered readers we saw earlier.

+
    w := bufio.NewWriter(f)
     n4, err := w.WriteString("buffered\n")
     fmt.Printf("wrote %d bytes\n", n4)
@@ -191,6 +202,7 @@ been applied to the underlying writer.

+
    w.Flush()
 
@@ -202,6 +214,7 @@ been applied to the underlying writer.

+
}
 
@@ -218,6 +231,7 @@ been applied to the underlying writer.

+
$ go run writing-files.go 
 wrote 5 bytes
 wrote 7 bytes
@@ -233,6 +247,7 @@ been applied to the underlying writer.

+
$ cat /tmp/dat1
 hello
 go
@@ -252,6 +267,7 @@ we’ve just seen to the stdin and stdout streams.
 
           
+
{{range .}} @@ -29,6 +28,7 @@ {{.DocsRendered}} diff --git a/tools/generate.go b/tools/generate.go index 4f1cc13..30d7291 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -118,9 +118,9 @@ var todoPat = regexp.MustCompile("\\/\\/ todo: ") var dashPat = regexp.MustCompile("\\-+") type Seg struct { - Docs, DocsRendered string - Code, CodeRendered string - CodeEmpty, CodeLeading bool + Docs, DocsRendered string + Code, CodeRendered string + CodeEmpty, CodeLeading, CodeRun bool } type Example struct { @@ -193,6 +193,7 @@ func parseSegs(sourcePath string) ([]*Seg, string) { for i, seg := range segs { seg.CodeEmpty = (seg.Code == "") seg.CodeLeading = (i < (len(segs) - 1)) + seg.CodeRun = strings.Contains(seg.Code, "package main") } return segs, filecontent }
+ {{if .CodeRun}}{{end}} {{.CodeRendered}}