diff --git a/examples/arrays/arrays.go b/examples/arrays/arrays.go
index b0464bd..54bff09 100644
--- a/examples/arrays/arrays.go
+++ b/examples/arrays/arrays.go
@@ -7,36 +7,36 @@ import "fmt"
func main() {
- // Here we create an array `a` that will hold exactly
- // 5 `int`s. The type of elements and length are both
- // part of the array's type. By default an array is
- // zero-valued, which for `int`s means `0`s.
- var a [5]int
- fmt.Println("emp:", a)
+ // Here we create an array `a` that will hold exactly
+ // 5 `int`s. The type of elements and length are both
+ // part of the array's type. By default an array is
+ // zero-valued, which for `int`s means `0`s.
+ var a [5]int
+ fmt.Println("emp:", a)
- // We can set a value at an index using the
- // `array[index] = value` syntax, and get a value with
- // `array[index]`.
- a[4] = 100
- fmt.Println("set:", a)
- fmt.Println("get:", a[4])
+ // We can set a value at an index using the
+ // `array[index] = value` syntax, and get a value with
+ // `array[index]`.
+ a[4] = 100
+ fmt.Println("set:", a)
+ fmt.Println("get:", a[4])
- // The builtin `len` returns the length of an array.
- fmt.Println("len:", len(a))
+ // The builtin `len` returns the length of an array.
+ fmt.Println("len:", len(a))
- // Use this syntax to declare and initialize an array
- // in one line.
- b := [5]int{1, 2, 3, 4, 5}
- fmt.Println("dcl:", b)
+ // Use this syntax to declare and initialize an array
+ // in one line.
+ b := [5]int{1, 2, 3, 4, 5}
+ fmt.Println("dcl:", b)
- // Array types are one-dimensional, but you can
- // compose types to build multi-dimensional data
- // structures.
- var twoD [2][3]int
- for i := 0; i < 2; i++ {
- for j := 0; j < 3; j++ {
- twoD[i][j] = i + j
- }
- }
- fmt.Println("2d: ", twoD)
+ // Array types are one-dimensional, but you can
+ // compose types to build multi-dimensional data
+ // structures.
+ var twoD [2][3]int
+ for i := 0; i < 2; i++ {
+ for j := 0; j < 3; j++ {
+ twoD[i][j] = i + j
+ }
+ }
+ fmt.Println("2d: ", twoD)
}
diff --git a/examples/arrays/arrays.hash b/examples/arrays/arrays.hash
index 516ae70..cae0e0d 100644
--- a/examples/arrays/arrays.hash
+++ b/examples/arrays/arrays.hash
@@ -1,2 +1,2 @@
305975d13d24223181d13f042b290906d86c1a0e
-l-A8eBnwio
+W7NwfDq8Vdw
diff --git a/examples/atomic-counters/atomic-counters.go b/examples/atomic-counters/atomic-counters.go
index 0f3a52e..9df3276 100644
--- a/examples/atomic-counters/atomic-counters.go
+++ b/examples/atomic-counters/atomic-counters.go
@@ -13,37 +13,37 @@ import "sync/atomic"
func main() {
- // We'll use an unsigned integer to represent our
- // (always-positive) counter.
- var ops uint64
+ // We'll use an unsigned integer to represent our
+ // (always-positive) counter.
+ var ops uint64
- // To simulate concurrent updates, we'll start 50
- // goroutines that each increment the counter about
- // once a millisecond.
- for i := 0; i < 50; i++ {
- go func() {
- for {
- // To atomically increment the counter we
- // use `AddUint64`, giving it the memory
- // address of our `ops` counter with the
- // `&` syntax.
- atomic.AddUint64(&ops, 1)
+ // To simulate concurrent updates, we'll start 50
+ // goroutines that each increment the counter about
+ // once a millisecond.
+ for i := 0; i < 50; i++ {
+ go func() {
+ for {
+ // To atomically increment the counter we
+ // use `AddUint64`, giving it the memory
+ // address of our `ops` counter with the
+ // `&` syntax.
+ atomic.AddUint64(&ops, 1)
- // Wait a bit between increments.
- time.Sleep(time.Millisecond)
- }
- }()
- }
+ // Wait a bit between increments.
+ time.Sleep(time.Millisecond)
+ }
+ }()
+ }
- // Wait a second to allow some ops to accumulate.
- time.Sleep(time.Second)
+ // Wait a second to allow some ops to accumulate.
+ time.Sleep(time.Second)
- // In order to safely use the counter while it's still
- // being updated by other goroutines, we extract a
- // copy of the current value into `opsFinal` via
- // `LoadUint64`. As above we need to give this
- // function the memory address `&ops` from which to
- // fetch the value.
- opsFinal := atomic.LoadUint64(&ops)
- fmt.Println("ops:", opsFinal)
+ // In order to safely use the counter while it's still
+ // being updated by other goroutines, we extract a
+ // copy of the current value into `opsFinal` via
+ // `LoadUint64`. As above we need to give this
+ // function the memory address `&ops` from which to
+ // fetch the value.
+ opsFinal := atomic.LoadUint64(&ops)
+ fmt.Println("ops:", opsFinal)
}
diff --git a/examples/base64-encoding/base64-encoding.go b/examples/base64-encoding/base64-encoding.go
index d428ae5..4bdeaf1 100644
--- a/examples/base64-encoding/base64-encoding.go
+++ b/examples/base64-encoding/base64-encoding.go
@@ -11,27 +11,27 @@ import "fmt"
func main() {
- // Here's the `string` we'll encode/decode.
- data := "abc123!?$*&()'-=@~"
+ // Here's the `string` we'll encode/decode.
+ data := "abc123!?$*&()'-=@~"
- // Go supports both standard and URL-compatible
- // base64. Here's how to encode using the standard
- // encoder. The encoder requires a `[]byte` so we
- // convert our `string` to that type.
- sEnc := b64.StdEncoding.EncodeToString([]byte(data))
- fmt.Println(sEnc)
+ // Go supports both standard and URL-compatible
+ // base64. Here's how to encode using the standard
+ // encoder. The encoder requires a `[]byte` so we
+ // convert our `string` to that type.
+ sEnc := b64.StdEncoding.EncodeToString([]byte(data))
+ fmt.Println(sEnc)
- // Decoding may return an error, which you can check
- // if you don't already know the input to be
- // well-formed.
- sDec, _ := b64.StdEncoding.DecodeString(sEnc)
- fmt.Println(string(sDec))
- fmt.Println()
+ // Decoding may return an error, which you can check
+ // if you don't already know the input to be
+ // well-formed.
+ sDec, _ := b64.StdEncoding.DecodeString(sEnc)
+ fmt.Println(string(sDec))
+ fmt.Println()
- // This encodes/decodes using a URL-compatible base64
- // format.
- uEnc := b64.URLEncoding.EncodeToString([]byte(data))
- fmt.Println(uEnc)
- uDec, _ := b64.URLEncoding.DecodeString(uEnc)
- fmt.Println(string(uDec))
+ // This encodes/decodes using a URL-compatible base64
+ // format.
+ uEnc := b64.URLEncoding.EncodeToString([]byte(data))
+ fmt.Println(uEnc)
+ uDec, _ := b64.URLEncoding.DecodeString(uEnc)
+ fmt.Println(string(uDec))
}
diff --git a/examples/channel-buffering/channel-buffering.go b/examples/channel-buffering/channel-buffering.go
index d6ee52e..d2e8d8f 100644
--- a/examples/channel-buffering/channel-buffering.go
+++ b/examples/channel-buffering/channel-buffering.go
@@ -11,17 +11,17 @@ import "fmt"
func main() {
- // Here we `make` a channel of strings buffering up to
- // 2 values.
- messages := make(chan string, 2)
+ // Here we `make` a channel of strings buffering up to
+ // 2 values.
+ messages := make(chan string, 2)
- // Because this channel is buffered, we can send these
- // values into the channel without a corresponding
- // concurrent receive.
- messages <- "buffered"
- messages <- "channel"
+ // Because this channel is buffered, we can send these
+ // values into the channel without a corresponding
+ // concurrent receive.
+ messages <- "buffered"
+ messages <- "channel"
- // Later we can receive these two values as usual.
- fmt.Println(<-messages)
- fmt.Println(<-messages)
+ // Later we can receive these two values as usual.
+ fmt.Println(<-messages)
+ fmt.Println(<-messages)
}
diff --git a/examples/channel-buffering/channel-buffering.hash b/examples/channel-buffering/channel-buffering.hash
index c82a990..6956e03 100644
--- a/examples/channel-buffering/channel-buffering.hash
+++ b/examples/channel-buffering/channel-buffering.hash
@@ -1,2 +1,2 @@
122140f7ad1bc5cff4fcd7a9e7245b87aaca3ec5
-34PVHwO6Bn
+mPoF-Xi-rip
diff --git a/examples/channel-directions/channel-directions.go b/examples/channel-directions/channel-directions.go
index becb45d..5f2786c 100644
--- a/examples/channel-directions/channel-directions.go
+++ b/examples/channel-directions/channel-directions.go
@@ -11,20 +11,20 @@ import "fmt"
// values. It would be a compile-time error to try to
// receive on this channel.
func ping(pings chan<- string, msg string) {
- pings <- msg
+ pings <- msg
}
// The `pong` function accepts one channel for receives
// (`pings`) and a second for sends (`pongs`).
func pong(pings <-chan string, pongs chan<- string) {
- msg := <-pings
- pongs <- msg
+ msg := <-pings
+ pongs <- msg
}
func main() {
- pings := make(chan string, 1)
- pongs := make(chan string, 1)
- ping(pings, "passed message")
- pong(pings, pongs)
- fmt.Println(<-pongs)
+ pings := make(chan string, 1)
+ pongs := make(chan string, 1)
+ ping(pings, "passed message")
+ pong(pings, pongs)
+ fmt.Println(<-pongs)
}
diff --git a/examples/channel-directions/channel-directions.hash b/examples/channel-directions/channel-directions.hash
index e881c47..fb68662 100644
--- a/examples/channel-directions/channel-directions.hash
+++ b/examples/channel-directions/channel-directions.hash
@@ -1,2 +1,2 @@
635cc13dfe33123ac188e01e3002d3aa935d765f
-P9Fujfpa1f
+Jnn9_9hC48c
diff --git a/examples/channel-synchronization/channel-synchronization.go b/examples/channel-synchronization/channel-synchronization.go
index 66873a8..79ceafe 100644
--- a/examples/channel-synchronization/channel-synchronization.go
+++ b/examples/channel-synchronization/channel-synchronization.go
@@ -13,22 +13,22 @@ import "time"
// `done` channel will be used to notify another
// goroutine that this function's work is done.
func worker(done chan bool) {
- fmt.Print("working...")
- time.Sleep(time.Second)
- fmt.Println("done")
+ fmt.Print("working...")
+ time.Sleep(time.Second)
+ fmt.Println("done")
- // Send a value to notify that we're done.
- done <- true
+ // Send a value to notify that we're done.
+ done <- true
}
func main() {
- // Start a worker goroutine, giving it the channel to
- // notify on.
- done := make(chan bool, 1)
- go worker(done)
+ // Start a worker goroutine, giving it the channel to
+ // notify on.
+ done := make(chan bool, 1)
+ go worker(done)
- // Block until we receive a notification from the
- // worker on the channel.
- <-done
+ // Block until we receive a notification from the
+ // worker on the channel.
+ <-done
}
diff --git a/examples/channels/channels.go b/examples/channels/channels.go
index 94fb458..7a5ac9a 100644
--- a/examples/channels/channels.go
+++ b/examples/channels/channels.go
@@ -9,18 +9,18 @@ import "fmt"
func main() {
- // Create a new channel with `make(chan val-type)`.
- // Channels are typed by the values they convey.
- messages := make(chan string)
+ // Create a new channel with `make(chan val-type)`.
+ // Channels are typed by the values they convey.
+ messages := make(chan string)
- // _Send_ a value into a channel using the `channel <-`
- // syntax. Here we send `"ping"` to the `messages`
- // channel we made above, from a new goroutine.
- go func() { messages <- "ping" }()
+ // _Send_ a value into a channel using the `channel <-`
+ // syntax. Here we send `"ping"` to the `messages`
+ // channel we made above, from a new goroutine.
+ go func() { messages <- "ping" }()
- // The `<-channel` syntax _receives_ a value from the
- // channel. Here we'll receive the `"ping"` message
- // we sent above and print it out.
- msg := <-messages
- fmt.Println(msg)
+ // The `<-channel` syntax _receives_ a value from the
+ // channel. Here we'll receive the `"ping"` message
+ // we sent above and print it out.
+ msg := <-messages
+ fmt.Println(msg)
}
diff --git a/examples/channels/channels.hash b/examples/channels/channels.hash
index 4f8f90e..92301ce 100644
--- a/examples/channels/channels.hash
+++ b/examples/channels/channels.hash
@@ -1,2 +1,2 @@
926212c784ab820648906c96f6ab21afbc161526
-Kd8B0T_JGK
+bRGMAqinovA
diff --git a/examples/closing-channels/closing-channels.go b/examples/closing-channels/closing-channels.go
index 575b4e9..926d9b5 100644
--- a/examples/closing-channels/closing-channels.go
+++ b/examples/closing-channels/closing-channels.go
@@ -11,40 +11,40 @@ import "fmt"
// to a worker goroutine. When we have no more jobs for
// the worker we'll `close` the `jobs` channel.
func main() {
- jobs := make(chan int, 5)
- done := make(chan bool)
+ jobs := make(chan int, 5)
+ done := make(chan bool)
- // Here's the worker goroutine. It repeatedly receives
- // from `jobs` with `j, more := <-jobs`. In this
- // special 2-value form of receive, the `more` value
- // will be `false` if `jobs` has been `close`d and all
- // values in the channel have already been received.
- // We use this to notify on `done` when we've worked
- // all our jobs.
- go func() {
- for {
- j, more := <-jobs
- if more {
- fmt.Println("received job", j)
- } else {
- fmt.Println("received all jobs")
- done <- true
- return
- }
- }
- }()
+ // Here's the worker goroutine. It repeatedly receives
+ // from `jobs` with `j, more := <-jobs`. In this
+ // special 2-value form of receive, the `more` value
+ // will be `false` if `jobs` has been `close`d and all
+ // values in the channel have already been received.
+ // We use this to notify on `done` when we've worked
+ // all our jobs.
+ go func() {
+ for {
+ j, more := <-jobs
+ if more {
+ fmt.Println("received job", j)
+ } else {
+ fmt.Println("received all jobs")
+ done <- true
+ return
+ }
+ }
+ }()
- // This sends 3 jobs to the worker over the `jobs`
- // channel, then closes it.
- for j := 1; j <= 3; j++ {
- jobs <- j
- fmt.Println("sent job", j)
- }
- close(jobs)
- fmt.Println("sent all jobs")
+ // This sends 3 jobs to the worker over the `jobs`
+ // channel, then closes it.
+ for j := 1; j <= 3; j++ {
+ jobs <- j
+ fmt.Println("sent job", j)
+ }
+ close(jobs)
+ fmt.Println("sent all jobs")
- // We await the worker using the
- // [synchronization](channel-synchronization) approach
- // we saw earlier.
- <-done
+ // We await the worker using the
+ // [synchronization](channel-synchronization) approach
+ // we saw earlier.
+ <-done
}
diff --git a/examples/closing-channels/closing-channels.hash b/examples/closing-channels/closing-channels.hash
index b6f3076..007751f 100644
--- a/examples/closing-channels/closing-channels.hash
+++ b/examples/closing-channels/closing-channels.hash
@@ -1,2 +1,2 @@
5205898a520533e46ea24c849848d19ebc2d08a9
-eFZ2SeKswH
+mkz69rVMHs6
diff --git a/examples/closures/closures.go b/examples/closures/closures.go
index 195a1ef..90dc2eb 100644
--- a/examples/closures/closures.go
+++ b/examples/closures/closures.go
@@ -12,29 +12,29 @@ import "fmt"
// returned function _closes over_ the variable `i` to
// form a closure.
func intSeq() func() int {
- i := 0
- return func() int {
- i++
- return i
- }
+ i := 0
+ return func() int {
+ i++
+ return i
+ }
}
func main() {
- // We call `intSeq`, assigning the result (a function)
- // to `nextInt`. This function value captures its
- // own `i` value, which will be updated each time
- // we call `nextInt`.
- nextInt := intSeq()
+ // We call `intSeq`, assigning the result (a function)
+ // to `nextInt`. This function value captures its
+ // own `i` value, which will be updated each time
+ // we call `nextInt`.
+ nextInt := intSeq()
- // See the effect of the closure by calling `nextInt`
- // a few times.
- fmt.Println(nextInt())
- fmt.Println(nextInt())
- fmt.Println(nextInt())
+ // See the effect of the closure by calling `nextInt`
+ // a few times.
+ fmt.Println(nextInt())
+ fmt.Println(nextInt())
+ fmt.Println(nextInt())
- // To confirm that the state is unique to that
- // particular function, create and test a new one.
- newInts := intSeq()
- fmt.Println(newInts())
+ // To confirm that the state is unique to that
+ // particular function, create and test a new one.
+ newInts := intSeq()
+ fmt.Println(newInts())
}
diff --git a/examples/collection-functions/collection-functions.go b/examples/collection-functions/collection-functions.go
index 1e217d5..b6ff547 100644
--- a/examples/collection-functions/collection-functions.go
+++ b/examples/collection-functions/collection-functions.go
@@ -24,88 +24,88 @@ import "fmt"
// Index returns the first index of the target string `t`, or
// -1 if no match is found.
func Index(vs []string, t string) int {
- for i, v := range vs {
- if v == t {
- return i
- }
- }
- return -1
+ for i, v := range vs {
+ if v == t {
+ return i
+ }
+ }
+ return -1
}
// Include returns `true` if the target string t is in the
// slice.
func Include(vs []string, t string) bool {
- return Index(vs, t) >= 0
+ return Index(vs, t) >= 0
}
// Any returns `true` if one of the strings in the slice
// satisfies the predicate `f`.
func Any(vs []string, f func(string) bool) bool {
- for _, v := range vs {
- if f(v) {
- return true
- }
- }
- return false
+ for _, v := range vs {
+ if f(v) {
+ return true
+ }
+ }
+ return false
}
// All returns `true` if all of the strings in the slice
// satisfy the predicate `f`.
func All(vs []string, f func(string) bool) bool {
- for _, v := range vs {
- if !f(v) {
- return false
- }
- }
- return true
+ for _, v := range vs {
+ if !f(v) {
+ return false
+ }
+ }
+ return true
}
// Filter returns a new slice containing all strings in the
// slice that satisfy the predicate `f`.
func Filter(vs []string, f func(string) bool) []string {
- vsf := make([]string, 0)
- for _, v := range vs {
- if f(v) {
- vsf = append(vsf, v)
- }
- }
- return vsf
+ vsf := make([]string, 0)
+ for _, v := range vs {
+ if f(v) {
+ vsf = append(vsf, v)
+ }
+ }
+ return vsf
}
// Map returns a new slice containing the results of applying
// 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 {
- vsm[i] = f(v)
- }
- return vsm
+ vsm := make([]string, len(vs))
+ for i, v := range vs {
+ vsm[i] = f(v)
+ }
+ return vsm
}
func main() {
- // Here we try out our various collection functions.
- var strs = []string{"peach", "apple", "pear", "plum"}
+ // Here we try out our various collection functions.
+ var strs = []string{"peach", "apple", "pear", "plum"}
- fmt.Println(Index(strs, "pear"))
+ fmt.Println(Index(strs, "pear"))
- fmt.Println(Include(strs, "grape"))
+ fmt.Println(Include(strs, "grape"))
- fmt.Println(Any(strs, func(v string) bool {
- return strings.HasPrefix(v, "p")
- }))
+ fmt.Println(Any(strs, func(v string) bool {
+ return strings.HasPrefix(v, "p")
+ }))
- fmt.Println(All(strs, func(v string) bool {
- return strings.HasPrefix(v, "p")
- }))
+ fmt.Println(All(strs, func(v string) bool {
+ return strings.HasPrefix(v, "p")
+ }))
- fmt.Println(Filter(strs, func(v string) bool {
- return strings.Contains(v, "e")
- }))
+ fmt.Println(Filter(strs, func(v string) bool {
+ return strings.Contains(v, "e")
+ }))
- // The above examples all used anonymous functions,
- // but you can also use named functions of the correct
- // type.
- fmt.Println(Map(strs, strings.ToUpper))
+ // The above examples all used anonymous functions,
+ // but you can also use named functions of the correct
+ // type.
+ fmt.Println(Map(strs, strings.ToUpper))
}
diff --git a/examples/command-line-arguments/command-line-arguments.go b/examples/command-line-arguments/command-line-arguments.go
index 275a6f7..e000e13 100644
--- a/examples/command-line-arguments/command-line-arguments.go
+++ b/examples/command-line-arguments/command-line-arguments.go
@@ -10,17 +10,17 @@ import "fmt"
func main() {
- // `os.Args` provides access to raw command-line
- // arguments. Note that the first value in this slice
- // is the path to the program, and `os.Args[1:]`
- // holds the arguments to the program.
- argsWithProg := os.Args
- argsWithoutProg := os.Args[1:]
+ // `os.Args` provides access to raw command-line
+ // arguments. Note that the first value in this slice
+ // is the path to the program, and `os.Args[1:]`
+ // holds the arguments to the program.
+ argsWithProg := os.Args
+ argsWithoutProg := os.Args[1:]
- // You can get individual args with normal indexing.
- arg := os.Args[3]
+ // You can get individual args with normal indexing.
+ arg := os.Args[3]
- fmt.Println(argsWithProg)
- fmt.Println(argsWithoutProg)
- fmt.Println(arg)
+ fmt.Println(argsWithProg)
+ fmt.Println(argsWithoutProg)
+ fmt.Println(arg)
}
diff --git a/examples/command-line-arguments/command-line-arguments.hash b/examples/command-line-arguments/command-line-arguments.hash
index 4fd8561..5bf53c7 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
+6pFdjf800jj
diff --git a/examples/command-line-flags/command-line-flags.go b/examples/command-line-flags/command-line-flags.go
index 717a8fb..ab9c1b7 100644
--- a/examples/command-line-flags/command-line-flags.go
+++ b/examples/command-line-flags/command-line-flags.go
@@ -13,37 +13,37 @@ import "fmt"
func main() {
- // Basic flag declarations are available for string,
- // integer, and boolean options. Here we declare a
- // string flag `word` with a default value `"foo"`
- // and a short description. This `flag.String` function
- // returns a string pointer (not a string value);
- // we'll see how to use this pointer below.
- wordPtr := flag.String("word", "foo", "a string")
+ // Basic flag declarations are available for string,
+ // integer, and boolean options. Here we declare a
+ // string flag `word` with a default value `"foo"`
+ // and a short description. This `flag.String` function
+ // returns a string pointer (not a string value);
+ // we'll see how to use this pointer below.
+ wordPtr := flag.String("word", "foo", "a string")
- // This declares `numb` and `fork` flags, using a
- // similar approach to the `word` flag.
- numbPtr := flag.Int("numb", 42, "an int")
- boolPtr := flag.Bool("fork", false, "a bool")
+ // This declares `numb` and `fork` flags, using a
+ // similar approach to the `word` flag.
+ numbPtr := flag.Int("numb", 42, "an int")
+ boolPtr := flag.Bool("fork", false, "a bool")
- // It's also possible to declare an option that uses an
- // existing var declared elsewhere in the program.
- // Note that we need to pass in a pointer to the flag
- // declaration function.
- var svar string
- flag.StringVar(&svar, "svar", "bar", "a string var")
+ // It's also possible to declare an option that uses an
+ // existing var declared elsewhere in the program.
+ // Note that we need to pass in a pointer to the flag
+ // declaration function.
+ var svar string
+ flag.StringVar(&svar, "svar", "bar", "a string var")
- // Once all flags are declared, call `flag.Parse()`
- // to execute the command-line parsing.
- flag.Parse()
+ // Once all flags are declared, call `flag.Parse()`
+ // to execute the command-line parsing.
+ flag.Parse()
- // Here we'll just dump out the parsed options and
- // any trailing positional arguments. Note that we
- // need to dereference the pointers with e.g. `*wordPtr`
- // to get the actual option values.
- fmt.Println("word:", *wordPtr)
- fmt.Println("numb:", *numbPtr)
- fmt.Println("fork:", *boolPtr)
- fmt.Println("svar:", svar)
- fmt.Println("tail:", flag.Args())
+ // Here we'll just dump out the parsed options and
+ // any trailing positional arguments. Note that we
+ // need to dereference the pointers with e.g. `*wordPtr`
+ // to get the actual option values.
+ fmt.Println("word:", *wordPtr)
+ fmt.Println("numb:", *numbPtr)
+ fmt.Println("fork:", *boolPtr)
+ fmt.Println("svar:", svar)
+ fmt.Println("tail:", flag.Args())
}
diff --git a/examples/command-line-flags/command-line-flags.hash b/examples/command-line-flags/command-line-flags.hash
index e3f2d05..1b8f3ac 100644
--- a/examples/command-line-flags/command-line-flags.hash
+++ b/examples/command-line-flags/command-line-flags.hash
@@ -1,2 +1,2 @@
e2ba0461c090789168c712cc7ed0f66aab09a8c8
-NASEOq2R3n
+klFR5DitrCy
diff --git a/examples/constants/constants.go b/examples/constants/constants.go
index ed4b56a..50ce8f2 100644
--- a/examples/constants/constants.go
+++ b/examples/constants/constants.go
@@ -10,24 +10,24 @@ import "math"
const s string = "constant"
func main() {
- fmt.Println(s)
+ fmt.Println(s)
- // A `const` statement can appear anywhere a `var`
- // statement can.
- const n = 500000000
+ // A `const` statement can appear anywhere a `var`
+ // statement can.
+ const n = 500000000
- // Constant expressions perform arithmetic with
- // arbitrary precision.
- const d = 3e20 / n
- fmt.Println(d)
+ // Constant expressions perform arithmetic with
+ // arbitrary precision.
+ const d = 3e20 / n
+ fmt.Println(d)
- // A numeric constant has no type until it's given
- // one, such as by an explicit conversion.
- fmt.Println(int64(d))
+ // A numeric constant has no type until it's given
+ // one, such as by an explicit conversion.
+ fmt.Println(int64(d))
- // A number can be given a type by using it in a
- // context that requires one, such as a variable
- // assignment or function call. For example, here
- // `math.Sin` expects a `float64`.
- fmt.Println(math.Sin(n))
+ // A number can be given a type by using it in a
+ // context that requires one, such as a variable
+ // assignment or function call. For example, here
+ // `math.Sin` expects a `float64`.
+ fmt.Println(math.Sin(n))
}
diff --git a/examples/defer/defer.go b/examples/defer/defer.go
index 46b8e67..06c827f 100644
--- a/examples/defer/defer.go
+++ b/examples/defer/defer.go
@@ -13,32 +13,32 @@ import "os"
// do that with `defer`.
func main() {
- // Immediately after getting a file object with
- // `createFile`, we defer the closing of that file
- // with `closeFile`. This will be executed at the end
- // of the enclosing function (`main`), after
- // `writeFile` has finished.
- f := createFile("/tmp/defer.txt")
- defer closeFile(f)
- writeFile(f)
+ // Immediately after getting a file object with
+ // `createFile`, we defer the closing of that file
+ // with `closeFile`. This will be executed at the end
+ // of the enclosing function (`main`), after
+ // `writeFile` has finished.
+ f := createFile("/tmp/defer.txt")
+ defer closeFile(f)
+ writeFile(f)
}
func createFile(p string) *os.File {
- fmt.Println("creating")
- f, err := os.Create(p)
- if err != nil {
- panic(err)
- }
- return f
+ fmt.Println("creating")
+ f, err := os.Create(p)
+ if err != nil {
+ panic(err)
+ }
+ return f
}
func writeFile(f *os.File) {
- fmt.Println("writing")
- fmt.Fprintln(f, "data")
+ fmt.Println("writing")
+ fmt.Fprintln(f, "data")
}
func closeFile(f *os.File) {
- fmt.Println("closing")
- f.Close()
+ fmt.Println("closing")
+ f.Close()
}
diff --git a/examples/defer/defer.hash b/examples/defer/defer.hash
index 726cb8c..2994617 100644
--- a/examples/defer/defer.hash
+++ b/examples/defer/defer.hash
@@ -1,2 +1,2 @@
570699fc50a1d39e9d0ad6a4461aef3248b080e1
-9aoHwzHcAo
+xPbQ5SGkH2O
diff --git a/examples/environment-variables/environment-variables.go b/examples/environment-variables/environment-variables.go
index 41852ac..beca4e7 100644
--- a/examples/environment-variables/environment-variables.go
+++ b/examples/environment-variables/environment-variables.go
@@ -11,21 +11,21 @@ import "fmt"
func main() {
- // To set a key/value pair, use `os.Setenv`. To get a
- // value for a key, use `os.Getenv`. This will return
- // an empty string if the key isn't present in the
- // environment.
- os.Setenv("FOO", "1")
- fmt.Println("FOO:", os.Getenv("FOO"))
- fmt.Println("BAR:", os.Getenv("BAR"))
+ // To set a key/value pair, use `os.Setenv`. To get a
+ // value for a key, use `os.Getenv`. This will return
+ // an empty string if the key isn't present in the
+ // environment.
+ os.Setenv("FOO", "1")
+ fmt.Println("FOO:", os.Getenv("FOO"))
+ fmt.Println("BAR:", os.Getenv("BAR"))
- // Use `os.Environ` to list all key/value pairs in the
- // environment. This returns a slice of strings in the
- // form `KEY=value`. You can `strings.Split` them to
- // get the key and value. Here we print all the keys.
- fmt.Println()
- for _, e := range os.Environ() {
- pair := strings.Split(e, "=")
- fmt.Println(pair[0])
- }
+ // Use `os.Environ` to list all key/value pairs in the
+ // environment. This returns a slice of strings in the
+ // form `KEY=value`. You can `strings.Split` them to
+ // get the key and value. Here we print all the keys.
+ fmt.Println()
+ for _, e := range os.Environ() {
+ pair := strings.Split(e, "=")
+ fmt.Println(pair[0])
+ }
}
diff --git a/examples/environment-variables/environment-variables.hash b/examples/environment-variables/environment-variables.hash
index ef39f96..81632ac 100644
--- a/examples/environment-variables/environment-variables.hash
+++ b/examples/environment-variables/environment-variables.hash
@@ -1,2 +1,2 @@
4d0832c5a1ddd4e95474791e8802c15452358214
-kfqLhpmEpw
+CZJ4R_uu6Uu
diff --git a/examples/epoch/epoch.go b/examples/epoch/epoch.go
index 1e196f1..63cffbb 100644
--- a/examples/epoch/epoch.go
+++ b/examples/epoch/epoch.go
@@ -10,24 +10,24 @@ import "time"
func main() {
- // Use `time.Now` with `Unix` or `UnixNano` to get
- // elapsed time since the Unix epoch in seconds or
- // nanoseconds, respectively.
- now := time.Now()
- secs := now.Unix()
- nanos := now.UnixNano()
- fmt.Println(now)
+ // Use `time.Now` with `Unix` or `UnixNano` to get
+ // elapsed time since the Unix epoch in seconds or
+ // nanoseconds, respectively.
+ now := time.Now()
+ secs := now.Unix()
+ nanos := now.UnixNano()
+ fmt.Println(now)
- // Note that there is no `UnixMillis`, so to get the
- // milliseconds since epoch you'll need to manually
- // divide from nanoseconds.
- millis := nanos / 1000000
- fmt.Println(secs)
- fmt.Println(millis)
- fmt.Println(nanos)
+ // Note that there is no `UnixMillis`, so to get the
+ // milliseconds since epoch you'll need to manually
+ // divide from nanoseconds.
+ millis := nanos / 1000000
+ fmt.Println(secs)
+ fmt.Println(millis)
+ fmt.Println(nanos)
- // You can also convert integer seconds or nanoseconds
- // since the epoch into the corresponding `time`.
- fmt.Println(time.Unix(secs, 0))
- fmt.Println(time.Unix(0, nanos))
+ // You can also convert integer seconds or nanoseconds
+ // since the epoch into the corresponding `time`.
+ fmt.Println(time.Unix(secs, 0))
+ fmt.Println(time.Unix(0, nanos))
}
diff --git a/examples/epoch/epoch.hash b/examples/epoch/epoch.hash
index 66c1160..3899c7f 100644
--- a/examples/epoch/epoch.hash
+++ b/examples/epoch/epoch.hash
@@ -1,2 +1,2 @@
61a498229c8878a97d729cfdd215e5f3960f87ac
-GP_zEjhlWk
+eN1Qv2ATB-C
diff --git a/examples/errors/errors.go b/examples/errors/errors.go
index 72a20b0..0b69bad 100644
--- a/examples/errors/errors.go
+++ b/examples/errors/errors.go
@@ -15,17 +15,17 @@ import "fmt"
// By convention, errors are the last return value and
// have type `error`, a built-in interface.
func f1(arg int) (int, error) {
- if arg == 42 {
+ if arg == 42 {
- // `errors.New` constructs a basic `error` value
- // with the given error message.
- return -1, errors.New("can't work with 42")
+ // `errors.New` constructs a basic `error` value
+ // with the given error message.
+ return -1, errors.New("can't work with 42")
- }
+ }
- // A `nil` value in the error position indicates that
- // there was no error.
- return arg + 3, nil
+ // A `nil` value in the error position indicates that
+ // there was no error.
+ return arg + 3, nil
}
// It's possible to use custom types as `error`s by
@@ -33,53 +33,53 @@ func f1(arg int) (int, error) {
// variant on the example above that uses a custom type
// to explicitly represent an argument error.
type argError struct {
- arg int
- prob string
+ arg int
+ prob string
}
func (e *argError) Error() string {
- return fmt.Sprintf("%d - %s", e.arg, e.prob)
+ return fmt.Sprintf("%d - %s", e.arg, e.prob)
}
func f2(arg int) (int, error) {
- if arg == 42 {
+ if arg == 42 {
- // In this case we use `&argError` syntax to build
- // a new struct, supplying values for the two
- // fields `arg` and `prob`.
- return -1, &argError{arg, "can't work with it"}
- }
- return arg + 3, nil
+ // In this case we use `&argError` syntax to build
+ // a new struct, supplying values for the two
+ // fields `arg` and `prob`.
+ return -1, &argError{arg, "can't work with it"}
+ }
+ return arg + 3, nil
}
func main() {
- // The two loops below test out each of our
- // error-returning functions. Note that the use of an
- // inline error check on the `if` line is a common
- // idiom in Go code.
- for _, i := range []int{7, 42} {
- if r, e := f1(i); e != nil {
- fmt.Println("f1 failed:", e)
- } else {
- fmt.Println("f1 worked:", r)
- }
- }
- for _, i := range []int{7, 42} {
- if r, e := f2(i); e != nil {
- fmt.Println("f2 failed:", e)
- } else {
- fmt.Println("f2 worked:", r)
- }
- }
+ // The two loops below test out each of our
+ // error-returning functions. Note that the use of an
+ // inline error check on the `if` line is a common
+ // idiom in Go code.
+ for _, i := range []int{7, 42} {
+ if r, e := f1(i); e != nil {
+ fmt.Println("f1 failed:", e)
+ } else {
+ fmt.Println("f1 worked:", r)
+ }
+ }
+ for _, i := range []int{7, 42} {
+ if r, e := f2(i); e != nil {
+ fmt.Println("f2 failed:", e)
+ } else {
+ fmt.Println("f2 worked:", r)
+ }
+ }
- // If you want to programmatically use the data in
- // a custom error, you'll need to get the error as an
- // instance of the custom error type via type
- // assertion.
- _, e := f2(42)
- if ae, ok := e.(*argError); ok {
- fmt.Println(ae.arg)
- fmt.Println(ae.prob)
- }
+ // If you want to programmatically use the data in
+ // a custom error, you'll need to get the error as an
+ // instance of the custom error type via type
+ // assertion.
+ _, e := f2(42)
+ if ae, ok := e.(*argError); ok {
+ fmt.Println(ae.arg)
+ fmt.Println(ae.prob)
+ }
}
diff --git a/examples/execing-processes/execing-processes.go b/examples/execing-processes/execing-processes.go
index 5963fe5..b9caed1 100644
--- a/examples/execing-processes/execing-processes.go
+++ b/examples/execing-processes/execing-processes.go
@@ -16,33 +16,33 @@ import "os/exec"
func main() {
- // For our example we'll exec `ls`. Go requires an
- // absolute path to the binary we want to execute, so
- // we'll use `exec.LookPath` to find it (probably
- // `/bin/ls`).
- binary, lookErr := exec.LookPath("ls")
- if lookErr != nil {
- panic(lookErr)
- }
+ // For our example we'll exec `ls`. Go requires an
+ // absolute path to the binary we want to execute, so
+ // we'll use `exec.LookPath` to find it (probably
+ // `/bin/ls`).
+ binary, lookErr := exec.LookPath("ls")
+ if lookErr != nil {
+ panic(lookErr)
+ }
- // `Exec` requires arguments in slice form (as
- // apposed to one big string). We'll give `ls` a few
- // common arguments. Note that the first argument should
- // be the program name.
- args := []string{"ls", "-a", "-l", "-h"}
+ // `Exec` requires arguments in slice form (as
+ // apposed to one big string). We'll give `ls` a few
+ // common arguments. Note that the first argument should
+ // be the program name.
+ args := []string{"ls", "-a", "-l", "-h"}
- // `Exec` also needs a set of [environment variables](environment-variables)
- // to use. Here we just provide our current
- // environment.
- env := os.Environ()
+ // `Exec` also needs a set of [environment variables](environment-variables)
+ // to use. Here we just provide our current
+ // environment.
+ env := os.Environ()
- // Here's the actual `syscall.Exec` call. If this call is
- // successful, the execution of our process will end
- // here and be replaced by the `/bin/ls -a -l -h`
- // process. If there is an error we'll get a return
- // value.
- execErr := syscall.Exec(binary, args, env)
- if execErr != nil {
- panic(execErr)
- }
+ // Here's the actual `syscall.Exec` call. If this call is
+ // successful, the execution of our process will end
+ // here and be replaced by the `/bin/ls -a -l -h`
+ // process. If there is an error we'll get a return
+ // value.
+ execErr := syscall.Exec(binary, args, env)
+ if execErr != nil {
+ panic(execErr)
+ }
}
diff --git a/examples/execing-processes/execing-processes.hash b/examples/execing-processes/execing-processes.hash
index ae5a08a..4701404 100644
--- a/examples/execing-processes/execing-processes.hash
+++ b/examples/execing-processes/execing-processes.hash
@@ -1,2 +1,2 @@
b527bbb76a42dd4bae541b73a7377b7e83e79905
-neqdJ51KLN
+bf11ADw-2Ho
diff --git a/examples/exit/exit.go b/examples/exit/exit.go
index 2563b86..d1e3646 100644
--- a/examples/exit/exit.go
+++ b/examples/exit/exit.go
@@ -8,12 +8,12 @@ import "os"
func main() {
- // `defer`s will _not_ be run when using `os.Exit`, so
- // this `fmt.Println` will never be called.
- defer fmt.Println("!")
+ // `defer`s will _not_ be run when using `os.Exit`, so
+ // this `fmt.Println` will never be called.
+ defer fmt.Println("!")
- // Exit with status 3.
- os.Exit(3)
+ // Exit with status 3.
+ os.Exit(3)
}
// Note that unlike e.g. C, Go does not use an integer
diff --git a/examples/exit/exit.hash b/examples/exit/exit.hash
index cb4c6a9..988b8f3 100644
--- a/examples/exit/exit.hash
+++ b/examples/exit/exit.hash
@@ -1,2 +1,2 @@
dc0bb3eaafa045d6aa05e88aff39322a1ccf822e
-CDiAh9SXRM
+vDaM0-MGJ_k
diff --git a/examples/for/for.go b/examples/for/for.go
index 1b1a2d7..7c4aa04 100644
--- a/examples/for/for.go
+++ b/examples/for/for.go
@@ -7,32 +7,32 @@ import "fmt"
func main() {
- // The most basic type, with a single condition.
- i := 1
- for i <= 3 {
- fmt.Println(i)
- i = i + 1
- }
+ // The most basic type, with a single condition.
+ i := 1
+ for i <= 3 {
+ fmt.Println(i)
+ i = i + 1
+ }
- // A classic initial/condition/after `for` loop.
- for j := 7; j <= 9; j++ {
- fmt.Println(j)
- }
+ // A classic initial/condition/after `for` loop.
+ for j := 7; j <= 9; j++ {
+ fmt.Println(j)
+ }
- // `for` without a condition will loop repeatedly
- // until you `break` out of the loop or `return` from
- // the enclosing function.
- for {
- fmt.Println("loop")
- break
- }
+ // `for` without a condition will loop repeatedly
+ // until you `break` out of the loop or `return` from
+ // the enclosing function.
+ for {
+ fmt.Println("loop")
+ break
+ }
- // You can also `continue` to the next iteration of
- // the loop.
- for n := 0; n <= 5; n++ {
- if n%2 == 0 {
- continue
- }
- fmt.Println(n)
- }
+ // You can also `continue` to the next iteration of
+ // the loop.
+ for n := 0; n <= 5; n++ {
+ if n%2 == 0 {
+ continue
+ }
+ fmt.Println(n)
+ }
}
diff --git a/examples/for/for.hash b/examples/for/for.hash
index b2dfc13..7852dec 100644
--- a/examples/for/for.hash
+++ b/examples/for/for.hash
@@ -1,2 +1,2 @@
33056d6b36f9894fb6359c9cf2ef8725bbdafa19
-KNLLSX4Io_
+lGYfUJwiGfi
diff --git a/examples/functions/functions.go b/examples/functions/functions.go
index 1895fc8..bf3e844 100644
--- a/examples/functions/functions.go
+++ b/examples/functions/functions.go
@@ -9,10 +9,10 @@ import "fmt"
// their sum as an `int`.
func plus(a int, b int) int {
- // Go requires explicit returns, i.e. it won't
- // automatically return the value of the last
- // expression.
- return a + b
+ // Go requires explicit returns, i.e. it won't
+ // automatically return the value of the last
+ // expression.
+ return a + b
}
// When you have multiple consecutive parameters of
@@ -20,16 +20,16 @@ func plus(a int, b int) int {
// like-typed parameters up to the final parameter that
// declares the type.
func plusPlus(a, b, c int) int {
- return a + b + c
+ return a + b + c
}
func main() {
- // Call a function just as you'd expect, with
- // `name(args)`.
- res := plus(1, 2)
- fmt.Println("1+2 =", res)
+ // Call a function just as you'd expect, with
+ // `name(args)`.
+ res := plus(1, 2)
+ fmt.Println("1+2 =", res)
- res = plusPlus(1, 2, 3)
- fmt.Println("1+2+3 =", res)
+ res = plusPlus(1, 2, 3)
+ fmt.Println("1+2+3 =", res)
}
diff --git a/examples/functions/functions.hash b/examples/functions/functions.hash
index 693c858..85d4e8f 100644
--- a/examples/functions/functions.hash
+++ b/examples/functions/functions.hash
@@ -1,2 +1,2 @@
ae669923c20e5ebf4a7b4b11b8fdf2972accf9e2
-9Nky-Dn49f
+hzGUvK6iJNm
diff --git a/examples/goroutines/goroutines.go b/examples/goroutines/goroutines.go
index eed6ee2..c2bdde8 100644
--- a/examples/goroutines/goroutines.go
+++ b/examples/goroutines/goroutines.go
@@ -5,33 +5,33 @@ package main
import "fmt"
func f(from string) {
- for i := 0; i < 3; i++ {
- fmt.Println(from, ":", i)
- }
+ for i := 0; i < 3; i++ {
+ fmt.Println(from, ":", i)
+ }
}
func main() {
- // Suppose we have a function call `f(s)`. Here's how
- // we'd call that in the usual way, running it
- // synchronously.
- f("direct")
+ // Suppose we have a function call `f(s)`. Here's how
+ // we'd call that in the usual way, running it
+ // synchronously.
+ f("direct")
- // To invoke this function in a goroutine, use
- // `go f(s)`. This new goroutine will execute
- // concurrently with the calling one.
- go f("goroutine")
+ // To invoke this function in a goroutine, use
+ // `go f(s)`. This new goroutine will execute
+ // concurrently with the calling one.
+ go f("goroutine")
- // You can also start a goroutine for an anonymous
- // function call.
- go func(msg string) {
- fmt.Println(msg)
- }("going")
+ // You can also start a goroutine for an anonymous
+ // function call.
+ go func(msg string) {
+ fmt.Println(msg)
+ }("going")
- // Our two function calls are running asynchronously in
- // separate goroutines now, so execution falls through
- // to here. This `Scanln` requires we press a key
- // before the program exits.
- fmt.Scanln()
- fmt.Println("done")
+ // Our two function calls are running asynchronously in
+ // separate goroutines now, so execution falls through
+ // to here. This `Scanln` requires we press a key
+ // before the program exits.
+ fmt.Scanln()
+ fmt.Println("done")
}
diff --git a/examples/hello-world/hello-world.go b/examples/hello-world/hello-world.go
index 18d23c2..4db5bfb 100644
--- a/examples/hello-world/hello-world.go
+++ b/examples/hello-world/hello-world.go
@@ -5,5 +5,5 @@ package main
import "fmt"
func main() {
- fmt.Println("hello world")
+ fmt.Println("hello world")
}
diff --git a/examples/hello-world/hello-world.hash b/examples/hello-world/hello-world.hash
index ced1ecb..df7b0e0 100644
--- a/examples/hello-world/hello-world.hash
+++ b/examples/hello-world/hello-world.hash
@@ -1,2 +1,2 @@
c98395a44701add5bf84e2f3a63e300fc1bc4bfe
-2C7wwJ6nxG
+mp1ENMU6ZYu
diff --git a/examples/http-clients/http-clients.go b/examples/http-clients/http-clients.go
index 56be133..7cd71ef 100644
--- a/examples/http-clients/http-clients.go
+++ b/examples/http-clients/http-clients.go
@@ -5,34 +5,34 @@
package main
import (
- "bufio"
- "fmt"
- "net/http"
+ "bufio"
+ "fmt"
+ "net/http"
)
func main() {
- // Issue an HTTP GET request to a server. `http.Get` is a
- // convenient shortcut around creating an `http.Client`
- // object and calling its `Get` method; it uses the
- // `http.DefaultClient` object which has useful default
- // settings.
- resp, err := http.Get("http://gobyexample.com")
- if err != nil {
- panic(err)
- }
- defer resp.Body.Close()
+ // Issue an HTTP GET request to a server. `http.Get` is a
+ // convenient shortcut around creating an `http.Client`
+ // object and calling its `Get` method; it uses the
+ // `http.DefaultClient` object which has useful default
+ // settings.
+ resp, err := http.Get("http://gobyexample.com")
+ if err != nil {
+ panic(err)
+ }
+ defer resp.Body.Close()
- // Print the HTTP response status.
- fmt.Println("Response status:", resp.Status)
+ // Print the HTTP response status.
+ fmt.Println("Response status:", resp.Status)
- // Print the first 5 lines of the response body.
- scanner := bufio.NewScanner(resp.Body)
- for i := 0; scanner.Scan() && i < 5; i++ {
- fmt.Println(scanner.Text())
- }
+ // Print the first 5 lines of the response body.
+ scanner := bufio.NewScanner(resp.Body)
+ for i := 0; scanner.Scan() && i < 5; i++ {
+ fmt.Println(scanner.Text())
+ }
- if err := scanner.Err(); err != nil {
- panic(err)
- }
+ if err := scanner.Err(); err != nil {
+ panic(err)
+ }
}
diff --git a/examples/if-else/if-else.go b/examples/if-else/if-else.go
index 3ed9586..1f2a403 100644
--- a/examples/if-else/if-else.go
+++ b/examples/if-else/if-else.go
@@ -7,28 +7,28 @@ import "fmt"
func main() {
- // Here's a basic example.
- if 7%2 == 0 {
- fmt.Println("7 is even")
- } else {
- fmt.Println("7 is odd")
- }
+ // Here's a basic example.
+ if 7%2 == 0 {
+ fmt.Println("7 is even")
+ } else {
+ fmt.Println("7 is odd")
+ }
- // You can have an `if` statement without an else.
- if 8%4 == 0 {
- fmt.Println("8 is divisible by 4")
- }
+ // You can have an `if` statement without an else.
+ if 8%4 == 0 {
+ fmt.Println("8 is divisible by 4")
+ }
- // A statement can precede conditionals; any variables
- // declared in this statement are available in all
- // branches.
- if num := 9; num < 0 {
- fmt.Println(num, "is negative")
- } else if num < 10 {
- fmt.Println(num, "has 1 digit")
- } else {
- fmt.Println(num, "has multiple digits")
- }
+ // A statement can precede conditionals; any variables
+ // declared in this statement are available in all
+ // branches.
+ if num := 9; num < 0 {
+ fmt.Println(num, "is negative")
+ } else if num < 10 {
+ fmt.Println(num, "has 1 digit")
+ } else {
+ fmt.Println(num, "has multiple digits")
+ }
}
// Note that you don't need parentheses around conditions
diff --git a/examples/if-else/if-else.hash b/examples/if-else/if-else.hash
index aefc6f9..844700f 100644
--- a/examples/if-else/if-else.hash
+++ b/examples/if-else/if-else.hash
@@ -1,2 +1,2 @@
89b78f3378e1a574ddfd0260a0404a962852eff8
-g-aqMz0Ivf
+p6-WKTqEks4
diff --git a/examples/interfaces/interfaces.go b/examples/interfaces/interfaces.go
index 2df7234..2ac30bd 100644
--- a/examples/interfaces/interfaces.go
+++ b/examples/interfaces/interfaces.go
@@ -8,35 +8,35 @@ import "math"
// Here's a basic interface for geometric shapes.
type geometry interface {
- area() float64
- perim() float64
+ area() float64
+ perim() float64
}
// For our example we'll implement this interface on
// `rect` and `circle` types.
type rect struct {
- width, height float64
+ width, height float64
}
type circle struct {
- radius float64
+ radius float64
}
// To implement an interface in Go, we just need to
// implement all the methods in the interface. Here we
// implement `geometry` on `rect`s.
func (r rect) area() float64 {
- return r.width * r.height
+ return r.width * r.height
}
func (r rect) perim() float64 {
- return 2*r.width + 2*r.height
+ return 2*r.width + 2*r.height
}
// The implementation for `circle`s.
func (c circle) area() float64 {
- return math.Pi * c.radius * c.radius
+ return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
- return 2 * math.Pi * c.radius
+ return 2 * math.Pi * c.radius
}
// If a variable has an interface type, then we can call
@@ -44,19 +44,19 @@ func (c circle) perim() float64 {
// generic `measure` function taking advantage of this
// to work on any `geometry`.
func measure(g geometry) {
- fmt.Println(g)
- fmt.Println(g.area())
- fmt.Println(g.perim())
+ fmt.Println(g)
+ fmt.Println(g.area())
+ fmt.Println(g.perim())
}
func main() {
- r := rect{width: 3, height: 4}
- c := circle{radius: 5}
+ r := rect{width: 3, height: 4}
+ c := circle{radius: 5}
- // The `circle` and `rect` struct types both
- // implement the `geometry` interface so we can use
- // instances of
- // these structs as arguments to `measure`.
- measure(r)
- measure(c)
+ // The `circle` and `rect` struct types both
+ // implement the `geometry` interface so we can use
+ // instances of
+ // these structs as arguments to `measure`.
+ measure(r)
+ measure(c)
}
diff --git a/examples/interfaces/interfaces.hash b/examples/interfaces/interfaces.hash
index aa81b50..d9daece 100644
--- a/examples/interfaces/interfaces.hash
+++ b/examples/interfaces/interfaces.hash
@@ -1,2 +1,2 @@
3547b935d1e0322c0fb696726c27cae53a275e0a
-313UebA3rD
+0EwsqIn3TTi
diff --git a/examples/json/json.go b/examples/json/json.go
index ff777a1..62bc1ea 100644
--- a/examples/json/json.go
+++ b/examples/json/json.go
@@ -11,109 +11,109 @@ import "os"
// We'll use these two structs to demonstrate encoding and
// decoding of custom types below.
type response1 struct {
- Page int
- Fruits []string
+ Page int
+ Fruits []string
}
type response2 struct {
- Page int `json:"page"`
- Fruits []string `json:"fruits"`
+ Page int `json:"page"`
+ Fruits []string `json:"fruits"`
}
func main() {
- // First we'll look at encoding basic data types to
- // JSON strings. Here are some examples for atomic
- // values.
- bolB, _ := json.Marshal(true)
- fmt.Println(string(bolB))
+ // First we'll look at encoding basic data types to
+ // JSON strings. Here are some examples for atomic
+ // values.
+ bolB, _ := json.Marshal(true)
+ fmt.Println(string(bolB))
- intB, _ := json.Marshal(1)
- fmt.Println(string(intB))
+ intB, _ := json.Marshal(1)
+ fmt.Println(string(intB))
- fltB, _ := json.Marshal(2.34)
- fmt.Println(string(fltB))
+ fltB, _ := json.Marshal(2.34)
+ fmt.Println(string(fltB))
- strB, _ := json.Marshal("gopher")
- fmt.Println(string(strB))
+ strB, _ := json.Marshal("gopher")
+ fmt.Println(string(strB))
- // And here are some for slices and maps, which encode
- // to JSON arrays and objects as you'd expect.
- slcD := []string{"apple", "peach", "pear"}
- slcB, _ := json.Marshal(slcD)
- fmt.Println(string(slcB))
+ // And here are some for slices and maps, which encode
+ // to JSON arrays and objects as you'd expect.
+ slcD := []string{"apple", "peach", "pear"}
+ slcB, _ := json.Marshal(slcD)
+ fmt.Println(string(slcB))
- mapD := map[string]int{"apple": 5, "lettuce": 7}
- mapB, _ := json.Marshal(mapD)
- fmt.Println(string(mapB))
+ mapD := map[string]int{"apple": 5, "lettuce": 7}
+ mapB, _ := json.Marshal(mapD)
+ fmt.Println(string(mapB))
- // The JSON package can automatically encode your
- // custom data types. It will only include exported
- // fields in the encoded output and will by default
- // use those names as the JSON keys.
- res1D := &response1{
- Page: 1,
- Fruits: []string{"apple", "peach", "pear"}}
- res1B, _ := json.Marshal(res1D)
- fmt.Println(string(res1B))
+ // The JSON package can automatically encode your
+ // custom data types. It will only include exported
+ // fields in the encoded output and will by default
+ // use those names as the JSON keys.
+ res1D := &response1{
+ Page: 1,
+ Fruits: []string{"apple", "peach", "pear"}}
+ res1B, _ := json.Marshal(res1D)
+ fmt.Println(string(res1B))
- // You can use tags on struct field declarations
- // to customize the encoded JSON key names. Check the
- // definition of `response2` above to see an example
- // of such tags.
- res2D := &response2{
- Page: 1,
- Fruits: []string{"apple", "peach", "pear"}}
- res2B, _ := json.Marshal(res2D)
- fmt.Println(string(res2B))
+ // You can use tags on struct field declarations
+ // to customize the encoded JSON key names. Check the
+ // definition of `response2` above to see an example
+ // of such tags.
+ res2D := &response2{
+ Page: 1,
+ Fruits: []string{"apple", "peach", "pear"}}
+ res2B, _ := json.Marshal(res2D)
+ fmt.Println(string(res2B))
- // Now let's look at decoding JSON data into Go
- // values. Here's an example for a generic data
- // structure.
- byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
+ // Now let's look at decoding JSON data into Go
+ // values. Here's an example for a generic data
+ // structure.
+ byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
- // We need to provide a variable where the JSON
- // package can put the decoded data. This
- // `map[string]interface{}` will hold a map of strings
- // to arbitrary data types.
- var dat map[string]interface{}
+ // We need to provide a variable where the JSON
+ // package can put the decoded data. This
+ // `map[string]interface{}` will hold a map of strings
+ // to arbitrary data types.
+ var dat map[string]interface{}
- // Here's the actual decoding, and a check for
- // associated errors.
- if err := json.Unmarshal(byt, &dat); err != nil {
- panic(err)
- }
- fmt.Println(dat)
+ // Here's the actual decoding, and a check for
+ // associated errors.
+ if err := json.Unmarshal(byt, &dat); err != nil {
+ panic(err)
+ }
+ fmt.Println(dat)
- // In order to use the values in the decoded map,
- // we'll need to convert them to their appropriate type.
- // For example here we convert the value in `num` to
- // the expected `float64` type.
- num := dat["num"].(float64)
- fmt.Println(num)
+ // In order to use the values in the decoded map,
+ // we'll need to convert them to their appropriate type.
+ // For example here we convert the value in `num` to
+ // the expected `float64` type.
+ num := dat["num"].(float64)
+ fmt.Println(num)
- // Accessing nested data requires a series of
- // conversions.
- strs := dat["strs"].([]interface{})
- str1 := strs[0].(string)
- fmt.Println(str1)
+ // Accessing nested data requires a series of
+ // conversions.
+ strs := dat["strs"].([]interface{})
+ str1 := strs[0].(string)
+ fmt.Println(str1)
- // We can also decode JSON into custom data types.
- // This has the advantages of adding additional
- // type-safety to our programs and eliminating the
- // need for type assertions when accessing the decoded
- // data.
- str := `{"page": 1, "fruits": ["apple", "peach"]}`
- res := response2{}
- json.Unmarshal([]byte(str), &res)
- fmt.Println(res)
- fmt.Println(res.Fruits[0])
+ // We can also decode JSON into custom data types.
+ // This has the advantages of adding additional
+ // type-safety to our programs and eliminating the
+ // need for type assertions when accessing the decoded
+ // data.
+ str := `{"page": 1, "fruits": ["apple", "peach"]}`
+ res := response2{}
+ json.Unmarshal([]byte(str), &res)
+ fmt.Println(res)
+ fmt.Println(res.Fruits[0])
- // In the examples above we always used bytes and
- // strings as intermediates between the data and
- // JSON representation on standard out. We can also
- // stream JSON encodings directly to `os.Writer`s like
- // `os.Stdout` or even HTTP response bodies.
- enc := json.NewEncoder(os.Stdout)
- d := map[string]int{"apple": 5, "lettuce": 7}
- enc.Encode(d)
+ // In the examples above we always used bytes and
+ // strings as intermediates between the data and
+ // JSON representation on standard out. We can also
+ // stream JSON encodings directly to `os.Writer`s like
+ // `os.Stdout` or even HTTP response bodies.
+ enc := json.NewEncoder(os.Stdout)
+ d := map[string]int{"apple": 5, "lettuce": 7}
+ enc.Encode(d)
}
diff --git a/examples/line-filters/line-filters.go b/examples/line-filters/line-filters.go
index 25b13da..abcdf96 100644
--- a/examples/line-filters/line-filters.go
+++ b/examples/line-filters/line-filters.go
@@ -9,33 +9,33 @@
package main
import (
- "bufio"
- "fmt"
- "os"
- "strings"
+ "bufio"
+ "fmt"
+ "os"
+ "strings"
)
func main() {
- // Wrapping the unbuffered `os.Stdin` with a buffered
- // scanner gives us a convenient `Scan` method that
- // advances the scanner to the next token; which is
- // the next line in the default scanner.
- scanner := bufio.NewScanner(os.Stdin)
+ // Wrapping the unbuffered `os.Stdin` with a buffered
+ // scanner gives us a convenient `Scan` method that
+ // advances the scanner to the next token; which is
+ // the next line in the default scanner.
+ scanner := bufio.NewScanner(os.Stdin)
- for scanner.Scan() {
- // `Text` returns the current token, here the next line,
- // from the input.
- ucl := strings.ToUpper(scanner.Text())
+ for scanner.Scan() {
+ // `Text` returns the current token, here the next line,
+ // from the input.
+ ucl := strings.ToUpper(scanner.Text())
- // Write out the uppercased line.
- fmt.Println(ucl)
- }
+ // Write out the uppercased line.
+ fmt.Println(ucl)
+ }
- // Check for errors during `Scan`. End of file is
- // expected and not reported by `Scan` as an error.
- if err := scanner.Err(); err != nil {
- fmt.Fprintln(os.Stderr, "error:", err)
- os.Exit(1)
- }
+ // Check for errors during `Scan`. End of file is
+ // expected and not reported by `Scan` as an error.
+ if err := scanner.Err(); err != nil {
+ fmt.Fprintln(os.Stderr, "error:", err)
+ os.Exit(1)
+ }
}
diff --git a/examples/line-filters/line-filters.hash b/examples/line-filters/line-filters.hash
index d36a15d..d62fbff 100644
--- a/examples/line-filters/line-filters.hash
+++ b/examples/line-filters/line-filters.hash
@@ -1,2 +1,2 @@
87f4a67edf741979f8ff6da85947aa177547f9ef
-mpYwOHj2ma
+hnaOIaQAjKF
diff --git a/examples/maps/maps.go b/examples/maps/maps.go
index 2ed1363..3346270 100644
--- a/examples/maps/maps.go
+++ b/examples/maps/maps.go
@@ -7,44 +7,44 @@ import "fmt"
func main() {
- // To create an empty map, use the builtin `make`:
- // `make(map[key-type]val-type)`.
- m := make(map[string]int)
+ // To create an empty map, use the builtin `make`:
+ // `make(map[key-type]val-type)`.
+ m := make(map[string]int)
- // Set key/value pairs using typical `name[key] = val`
- // syntax.
- m["k1"] = 7
- m["k2"] = 13
+ // Set key/value pairs using typical `name[key] = val`
+ // syntax.
+ m["k1"] = 7
+ m["k2"] = 13
- // Printing a map with e.g. `fmt.Println` will show all of
- // its key/value pairs.
- fmt.Println("map:", m)
+ // Printing a map with e.g. `fmt.Println` will show all of
+ // its key/value pairs.
+ fmt.Println("map:", m)
- // Get a value for a key with `name[key]`.
- v1 := m["k1"]
- fmt.Println("v1: ", v1)
+ // Get a value for a key with `name[key]`.
+ v1 := m["k1"]
+ fmt.Println("v1: ", v1)
- // The builtin `len` returns the number of key/value
- // pairs when called on a map.
- fmt.Println("len:", len(m))
+ // The builtin `len` returns the number of key/value
+ // pairs when called on a map.
+ fmt.Println("len:", len(m))
- // The builtin `delete` removes key/value pairs from
- // a map.
- delete(m, "k2")
- fmt.Println("map:", m)
+ // The builtin `delete` removes key/value pairs from
+ // a map.
+ delete(m, "k2")
+ fmt.Println("map:", m)
- // The optional second return value when getting a
- // value from a map indicates if the key was present
- // in the map. This can be used to disambiguate
- // between missing keys and keys with zero values
- // like `0` or `""`. Here we didn't need the value
- // itself, so we ignored it with the _blank identifier_
- // `_`.
- _, prs := m["k2"]
- fmt.Println("prs:", prs)
+ // The optional second return value when getting a
+ // value from a map indicates if the key was present
+ // in the map. This can be used to disambiguate
+ // between missing keys and keys with zero values
+ // like `0` or `""`. Here we didn't need the value
+ // itself, so we ignored it with the _blank identifier_
+ // `_`.
+ _, prs := m["k2"]
+ fmt.Println("prs:", prs)
- // You can also declare and initialize a new map in
- // the same line with this syntax.
- n := map[string]int{"foo": 1, "bar": 2}
- fmt.Println("map:", n)
+ // You can also declare and initialize a new map in
+ // the same line with this syntax.
+ n := map[string]int{"foo": 1, "bar": 2}
+ fmt.Println("map:", n)
}
diff --git a/examples/methods/methods.go b/examples/methods/methods.go
index 0f006a4..e56cb6f 100644
--- a/examples/methods/methods.go
+++ b/examples/methods/methods.go
@@ -5,33 +5,33 @@ package main
import "fmt"
type rect struct {
- width, height int
+ width, height int
}
// This `area` method has a _receiver type_ of `*rect`.
func (r *rect) area() int {
- return r.width * r.height
+ return r.width * r.height
}
// Methods can be defined for either pointer or value
// receiver types. Here's an example of a value receiver.
func (r rect) perim() int {
- return 2*r.width + 2*r.height
+ return 2*r.width + 2*r.height
}
func main() {
- r := rect{width: 10, height: 5}
+ r := rect{width: 10, height: 5}
- // Here we call the 2 methods defined for our struct.
- fmt.Println("area: ", r.area())
- fmt.Println("perim:", r.perim())
+ // Here we call the 2 methods defined for our struct.
+ fmt.Println("area: ", r.area())
+ fmt.Println("perim:", r.perim())
- // Go automatically handles conversion between values
- // and pointers for method calls. You may want to use
- // a pointer receiver type to avoid copying on method
- // calls or to allow the method to mutate the
- // receiving struct.
- rp := &r
- fmt.Println("area: ", rp.area())
- fmt.Println("perim:", rp.perim())
+ // Go automatically handles conversion between values
+ // and pointers for method calls. You may want to use
+ // a pointer receiver type to avoid copying on method
+ // calls or to allow the method to mutate the
+ // receiving struct.
+ rp := &r
+ fmt.Println("area: ", rp.area())
+ fmt.Println("perim:", rp.perim())
}
diff --git a/examples/methods/methods.hash b/examples/methods/methods.hash
index bcb0099..00c7c28 100644
--- a/examples/methods/methods.hash
+++ b/examples/methods/methods.hash
@@ -1,2 +1,2 @@
24cfb9ad45e43c2d49163149bc55925a4e1b3c7a
-254m_9Yjwa
+ffMb0txGnYB
diff --git a/examples/multiple-return-values/multiple-return-values.go b/examples/multiple-return-values/multiple-return-values.go
index 9b970a6..cb541c4 100644
--- a/examples/multiple-return-values/multiple-return-values.go
+++ b/examples/multiple-return-values/multiple-return-values.go
@@ -9,19 +9,19 @@ import "fmt"
// The `(int, int)` in this function signature shows that
// the function returns 2 `int`s.
func vals() (int, int) {
- return 3, 7
+ return 3, 7
}
func main() {
- // Here we use the 2 different return values from the
- // call with _multiple assignment_.
- a, b := vals()
- fmt.Println(a)
- fmt.Println(b)
+ // Here we use the 2 different return values from the
+ // call with _multiple assignment_.
+ a, b := vals()
+ fmt.Println(a)
+ fmt.Println(b)
- // If you only want a subset of the returned values,
- // use the blank identifier `_`.
- _, c := vals()
- fmt.Println(c)
+ // If you only want a subset of the returned values,
+ // use the blank identifier `_`.
+ _, c := vals()
+ fmt.Println(c)
}
diff --git a/examples/multiple-return-values/multiple-return-values.hash b/examples/multiple-return-values/multiple-return-values.hash
index 0e13a88..73f9fa8 100644
--- a/examples/multiple-return-values/multiple-return-values.hash
+++ b/examples/multiple-return-values/multiple-return-values.hash
@@ -1,2 +1,2 @@
5063ce3d3c70c6bd70f4b709de24bb93d0f24e0c
-chwFmr5dG1
+FZoIB5LXQGZ
diff --git a/examples/mutexes/mutexes.go b/examples/mutexes/mutexes.go
index 1e7f3da..79b0c31 100644
--- a/examples/mutexes/mutexes.go
+++ b/examples/mutexes/mutexes.go
@@ -6,80 +6,80 @@
package main
import (
- "fmt"
- "math/rand"
- "sync"
- "sync/atomic"
- "time"
+ "fmt"
+ "math/rand"
+ "sync"
+ "sync/atomic"
+ "time"
)
func main() {
- // For our example the `state` will be a map.
- var state = make(map[int]int)
+ // For our example the `state` will be a map.
+ var state = make(map[int]int)
- // This `mutex` will synchronize access to `state`.
- var mutex = &sync.Mutex{}
+ // This `mutex` will synchronize access to `state`.
+ var mutex = &sync.Mutex{}
- // We'll keep track of how many read and write
- // operations we do.
- var readOps uint64
- var writeOps uint64
+ // We'll keep track of how many read and write
+ // operations we do.
+ var readOps uint64
+ var writeOps uint64
- // Here we start 100 goroutines to execute repeated
- // reads against the state, once per millisecond in
- // each goroutine.
- for r := 0; r < 100; r++ {
- go func() {
- total := 0
- for {
+ // Here we start 100 goroutines to execute repeated
+ // reads against the state, once per millisecond in
+ // each goroutine.
+ for r := 0; r < 100; r++ {
+ go func() {
+ total := 0
+ for {
- // For each read we pick a key to access,
- // `Lock()` the `mutex` to ensure
- // exclusive access to the `state`, read
- // the value at the chosen key,
- // `Unlock()` the mutex, and increment
- // the `readOps` count.
- key := rand.Intn(5)
- mutex.Lock()
- total += state[key]
- mutex.Unlock()
- atomic.AddUint64(&readOps, 1)
+ // For each read we pick a key to access,
+ // `Lock()` the `mutex` to ensure
+ // exclusive access to the `state`, read
+ // the value at the chosen key,
+ // `Unlock()` the mutex, and increment
+ // the `readOps` count.
+ key := rand.Intn(5)
+ mutex.Lock()
+ total += state[key]
+ mutex.Unlock()
+ atomic.AddUint64(&readOps, 1)
- // Wait a bit between reads.
- time.Sleep(time.Millisecond)
- }
- }()
- }
+ // Wait a bit between reads.
+ time.Sleep(time.Millisecond)
+ }
+ }()
+ }
- // We'll also start 10 goroutines to simulate writes,
- // using the same pattern we did for reads.
- for w := 0; w < 10; w++ {
- go func() {
- for {
- key := rand.Intn(5)
- val := rand.Intn(100)
- mutex.Lock()
- state[key] = val
- mutex.Unlock()
- atomic.AddUint64(&writeOps, 1)
- time.Sleep(time.Millisecond)
- }
- }()
- }
+ // We'll also start 10 goroutines to simulate writes,
+ // using the same pattern we did for reads.
+ for w := 0; w < 10; w++ {
+ go func() {
+ for {
+ key := rand.Intn(5)
+ val := rand.Intn(100)
+ mutex.Lock()
+ state[key] = val
+ mutex.Unlock()
+ atomic.AddUint64(&writeOps, 1)
+ time.Sleep(time.Millisecond)
+ }
+ }()
+ }
- // Let the 10 goroutines work on the `state` and
- // `mutex` for a second.
- time.Sleep(time.Second)
+ // Let the 10 goroutines work on the `state` and
+ // `mutex` for a second.
+ time.Sleep(time.Second)
- // Take and report final operation counts.
- readOpsFinal := atomic.LoadUint64(&readOps)
- fmt.Println("readOps:", readOpsFinal)
- writeOpsFinal := atomic.LoadUint64(&writeOps)
- fmt.Println("writeOps:", writeOpsFinal)
+ // Take and report final operation counts.
+ readOpsFinal := atomic.LoadUint64(&readOps)
+ fmt.Println("readOps:", readOpsFinal)
+ writeOpsFinal := atomic.LoadUint64(&writeOps)
+ fmt.Println("writeOps:", writeOpsFinal)
- // With a final lock of `state`, show how it ended up.
- mutex.Lock()
- fmt.Println("state:", state)
- mutex.Unlock()
+ // With a final lock of `state`, show how it ended up.
+ mutex.Lock()
+ fmt.Println("state:", state)
+ mutex.Unlock()
}
diff --git a/examples/non-blocking-channel-operations/non-blocking-channel-operations.go b/examples/non-blocking-channel-operations/non-blocking-channel-operations.go
index dfd0516..2429da1 100644
--- a/examples/non-blocking-channel-operations/non-blocking-channel-operations.go
+++ b/examples/non-blocking-channel-operations/non-blocking-channel-operations.go
@@ -8,42 +8,42 @@ package main
import "fmt"
func main() {
- messages := make(chan string)
- signals := make(chan bool)
+ messages := make(chan string)
+ signals := make(chan bool)
- // Here's a non-blocking receive. If a value is
- // available on `messages` then `select` will take
- // the `<-messages` `case` with that value. If not
- // it will immediately take the `default` case.
- select {
- case msg := <-messages:
- fmt.Println("received message", msg)
- default:
- fmt.Println("no message received")
- }
+ // Here's a non-blocking receive. If a value is
+ // available on `messages` then `select` will take
+ // the `<-messages` `case` with that value. If not
+ // it will immediately take the `default` case.
+ select {
+ case msg := <-messages:
+ fmt.Println("received message", msg)
+ default:
+ fmt.Println("no message received")
+ }
- // A non-blocking send works similarly. Here `msg`
- // cannot be sent to the `messages` channel, because
- // the channel has no buffer and there is no receiver.
- // Therefore the `default` case is selected.
- msg := "hi"
- select {
- case messages <- msg:
- fmt.Println("sent message", msg)
- default:
- fmt.Println("no message sent")
- }
+ // A non-blocking send works similarly. Here `msg`
+ // cannot be sent to the `messages` channel, because
+ // the channel has no buffer and there is no receiver.
+ // Therefore the `default` case is selected.
+ msg := "hi"
+ select {
+ case messages <- msg:
+ fmt.Println("sent message", msg)
+ default:
+ fmt.Println("no message sent")
+ }
- // We can use multiple `case`s above the `default`
- // clause to implement a multi-way non-blocking
- // select. Here we attempt non-blocking receives
- // on both `messages` and `signals`.
- select {
- case msg := <-messages:
- fmt.Println("received message", msg)
- case sig := <-signals:
- fmt.Println("received signal", sig)
- default:
- fmt.Println("no activity")
- }
+ // We can use multiple `case`s above the `default`
+ // clause to implement a multi-way non-blocking
+ // select. Here we attempt non-blocking receives
+ // on both `messages` and `signals`.
+ select {
+ case msg := <-messages:
+ fmt.Println("received message", msg)
+ case sig := <-signals:
+ fmt.Println("received signal", sig)
+ default:
+ fmt.Println("no activity")
+ }
}
diff --git a/examples/number-parsing/number-parsing.go b/examples/number-parsing/number-parsing.go
index c7751cf..15a03bf 100644
--- a/examples/number-parsing/number-parsing.go
+++ b/examples/number-parsing/number-parsing.go
@@ -10,31 +10,31 @@ import "fmt"
func main() {
- // With `ParseFloat`, this `64` tells how many bits of
- // precision to parse.
- f, _ := strconv.ParseFloat("1.234", 64)
- fmt.Println(f)
+ // With `ParseFloat`, this `64` tells how many bits of
+ // precision to parse.
+ f, _ := strconv.ParseFloat("1.234", 64)
+ fmt.Println(f)
- // For `ParseInt`, the `0` means infer the base from
- // the string. `64` requires that the result fit in 64
- // bits.
- i, _ := strconv.ParseInt("123", 0, 64)
- fmt.Println(i)
+ // For `ParseInt`, the `0` means infer the base from
+ // the string. `64` requires that the result fit in 64
+ // bits.
+ i, _ := strconv.ParseInt("123", 0, 64)
+ fmt.Println(i)
- // `ParseInt` will recognize hex-formatted numbers.
- d, _ := strconv.ParseInt("0x1c8", 0, 64)
- fmt.Println(d)
+ // `ParseInt` will recognize hex-formatted numbers.
+ d, _ := strconv.ParseInt("0x1c8", 0, 64)
+ fmt.Println(d)
- // A `ParseUint` is also available.
- u, _ := strconv.ParseUint("789", 0, 64)
- fmt.Println(u)
+ // A `ParseUint` is also available.
+ u, _ := strconv.ParseUint("789", 0, 64)
+ fmt.Println(u)
- // `Atoi` is a convenience function for basic base-10
- // `int` parsing.
- k, _ := strconv.Atoi("135")
- fmt.Println(k)
+ // `Atoi` is a convenience function for basic base-10
+ // `int` parsing.
+ k, _ := strconv.Atoi("135")
+ fmt.Println(k)
- // Parse functions return an error on bad input.
- _, e := strconv.Atoi("wat")
- fmt.Println(e)
+ // Parse functions return an error on bad input.
+ _, e := strconv.Atoi("wat")
+ fmt.Println(e)
}
diff --git a/examples/number-parsing/number-parsing.hash b/examples/number-parsing/number-parsing.hash
index 714860f..3249903 100644
--- a/examples/number-parsing/number-parsing.hash
+++ b/examples/number-parsing/number-parsing.hash
@@ -1,2 +1,2 @@
0d2155e9863a73c098d44637e92403d7f5e8e965
-N90EppECFk
+NZh4LjhguvN
diff --git a/examples/panic/panic.go b/examples/panic/panic.go
index c06f3b6..27e72f0 100644
--- a/examples/panic/panic.go
+++ b/examples/panic/panic.go
@@ -9,17 +9,17 @@ import "os"
func main() {
- // We'll use panic throughout this site to check for
- // unexpected errors. This is the only program on the
- // site designed to panic.
- panic("a problem")
+ // We'll use panic throughout this site to check for
+ // unexpected errors. This is the only program on the
+ // site designed to panic.
+ panic("a problem")
- // A common use of panic is to abort if a function
- // returns an error value that we don't know how to
- // (or want to) handle. Here's an example of
- // `panic`king if we get an unexpected error when creating a new file.
- _, err := os.Create("/tmp/file")
- if err != nil {
- panic(err)
- }
+ // A common use of panic is to abort if a function
+ // returns an error value that we don't know how to
+ // (or want to) handle. Here's an example of
+ // `panic`king if we get an unexpected error when creating a new file.
+ _, err := os.Create("/tmp/file")
+ if err != nil {
+ panic(err)
+ }
}
diff --git a/examples/panic/panic.hash b/examples/panic/panic.hash
index 5c411f6..bd32ff3 100644
--- a/examples/panic/panic.hash
+++ b/examples/panic/panic.hash
@@ -1,2 +1,2 @@
91639bbcfcc6ed088295a9ee6b1c36ab35ae402a
-c86oXzfQOt
+91HXbZZZopt
diff --git a/examples/pointers/pointers.go b/examples/pointers/pointers.go
index bb64a38..5574997 100644
--- a/examples/pointers/pointers.go
+++ b/examples/pointers/pointers.go
@@ -12,7 +12,7 @@ import "fmt"
// value. `zeroval` will get a copy of `ival` distinct
// from the one in the calling function.
func zeroval(ival int) {
- ival = 0
+ ival = 0
}
// `zeroptr` in contrast has an `*int` parameter, meaning
@@ -22,21 +22,21 @@ func zeroval(ival int) {
// Assigning a value to a dereferenced pointer changes the
// value at the referenced address.
func zeroptr(iptr *int) {
- *iptr = 0
+ *iptr = 0
}
func main() {
- i := 1
- fmt.Println("initial:", i)
+ i := 1
+ fmt.Println("initial:", i)
- zeroval(i)
- fmt.Println("zeroval:", i)
+ zeroval(i)
+ fmt.Println("zeroval:", i)
- // The `&i` syntax gives the memory address of `i`,
- // i.e. a pointer to `i`.
- zeroptr(&i)
- fmt.Println("zeroptr:", i)
+ // The `&i` syntax gives the memory address of `i`,
+ // i.e. a pointer to `i`.
+ zeroptr(&i)
+ fmt.Println("zeroptr:", i)
- // Pointers can be printed too.
- fmt.Println("pointer:", &i)
+ // Pointers can be printed too.
+ fmt.Println("pointer:", &i)
}
diff --git a/examples/pointers/pointers.hash b/examples/pointers/pointers.hash
index 6cb7efd..a0c5985 100644
--- a/examples/pointers/pointers.hash
+++ b/examples/pointers/pointers.hash
@@ -1,2 +1,2 @@
85cff3345d2f22b65a5d54eb8f7aa8f508f27887
-KdE4TBbUL2
+fnQkHp4hriG
diff --git a/examples/random-numbers/random-numbers.go b/examples/random-numbers/random-numbers.go
index 34b065c..b27c200 100644
--- a/examples/random-numbers/random-numbers.go
+++ b/examples/random-numbers/random-numbers.go
@@ -10,45 +10,45 @@ import "math/rand"
func main() {
- // For example, `rand.Intn` returns a random `int` n,
- // `0 <= n < 100`.
- fmt.Print(rand.Intn(100), ",")
- fmt.Print(rand.Intn(100))
- fmt.Println()
+ // For example, `rand.Intn` returns a random `int` n,
+ // `0 <= n < 100`.
+ fmt.Print(rand.Intn(100), ",")
+ fmt.Print(rand.Intn(100))
+ fmt.Println()
- // `rand.Float64` returns a `float64` `f`,
- // `0.0 <= f < 1.0`.
- fmt.Println(rand.Float64())
+ // `rand.Float64` returns a `float64` `f`,
+ // `0.0 <= f < 1.0`.
+ fmt.Println(rand.Float64())
- // This can be used to generate random floats in
- // other ranges, for example `5.0 <= f' < 10.0`.
- fmt.Print((rand.Float64()*5)+5, ",")
- fmt.Print((rand.Float64() * 5) + 5)
- fmt.Println()
+ // This can be used to generate random floats in
+ // other ranges, for example `5.0 <= f' < 10.0`.
+ fmt.Print((rand.Float64()*5)+5, ",")
+ fmt.Print((rand.Float64() * 5) + 5)
+ fmt.Println()
- // The default number generator is deterministic, so it'll
- // produce the same sequence of numbers each time by default.
- // To produce varying sequences, give it a seed that changes.
- // Note that this is not safe to use for random numbers you
- // intend to be secret, use `crypto/rand` for those.
- s1 := rand.NewSource(time.Now().UnixNano())
- r1 := rand.New(s1)
+ // The default number generator is deterministic, so it'll
+ // produce the same sequence of numbers each time by default.
+ // To produce varying sequences, give it a seed that changes.
+ // Note that this is not safe to use for random numbers you
+ // intend to be secret, use `crypto/rand` for those.
+ s1 := rand.NewSource(time.Now().UnixNano())
+ r1 := rand.New(s1)
- // Call the resulting `rand.Rand` just like the
- // functions on the `rand` package.
- fmt.Print(r1.Intn(100), ",")
- fmt.Print(r1.Intn(100))
- fmt.Println()
+ // Call the resulting `rand.Rand` just like the
+ // functions on the `rand` package.
+ fmt.Print(r1.Intn(100), ",")
+ fmt.Print(r1.Intn(100))
+ fmt.Println()
- // If you seed a source with the same number, it
- // produces the same sequence of random numbers.
- s2 := rand.NewSource(42)
- r2 := rand.New(s2)
- fmt.Print(r2.Intn(100), ",")
- fmt.Print(r2.Intn(100))
- fmt.Println()
- s3 := rand.NewSource(42)
- r3 := rand.New(s3)
- fmt.Print(r3.Intn(100), ",")
- fmt.Print(r3.Intn(100))
+ // If you seed a source with the same number, it
+ // produces the same sequence of random numbers.
+ s2 := rand.NewSource(42)
+ r2 := rand.New(s2)
+ fmt.Print(r2.Intn(100), ",")
+ fmt.Print(r2.Intn(100))
+ fmt.Println()
+ s3 := rand.NewSource(42)
+ r3 := rand.New(s3)
+ fmt.Print(r3.Intn(100), ",")
+ fmt.Print(r3.Intn(100))
}
diff --git a/examples/random-numbers/random-numbers.hash b/examples/random-numbers/random-numbers.hash
index fa0ec46..87959ee 100644
--- a/examples/random-numbers/random-numbers.hash
+++ b/examples/random-numbers/random-numbers.hash
@@ -1,2 +1,2 @@
8e97de760147b061dd09939db294c892211b6b80
-ZdFpbahgC1
+jiJaIjxL2sP
diff --git a/examples/range-over-channels/range-over-channels.go b/examples/range-over-channels/range-over-channels.go
index 05bb2eb..d8aa729 100644
--- a/examples/range-over-channels/range-over-channels.go
+++ b/examples/range-over-channels/range-over-channels.go
@@ -9,17 +9,17 @@ import "fmt"
func main() {
- // We'll iterate over 2 values in the `queue` channel.
- queue := make(chan string, 2)
- queue <- "one"
- queue <- "two"
- close(queue)
+ // We'll iterate over 2 values in the `queue` channel.
+ queue := make(chan string, 2)
+ queue <- "one"
+ queue <- "two"
+ close(queue)
- // This `range` iterates over each element as it's
- // received from `queue`. Because we `close`d the
- // channel above, the iteration terminates after
- // receiving the 2 elements.
- for elem := range queue {
- fmt.Println(elem)
- }
+ // This `range` iterates over each element as it's
+ // received from `queue`. Because we `close`d the
+ // channel above, the iteration terminates after
+ // receiving the 2 elements.
+ for elem := range queue {
+ fmt.Println(elem)
+ }
}
diff --git a/examples/range-over-channels/range-over-channels.hash b/examples/range-over-channels/range-over-channels.hash
index fa6f095..f0ffe62 100644
--- a/examples/range-over-channels/range-over-channels.hash
+++ b/examples/range-over-channels/range-over-channels.hash
@@ -1,2 +1,2 @@
8b5d8a77e84c34771c5b14af014ecef3f88b2a6c
-I63ge2ISDs
+QnARPm-ddFB
diff --git a/examples/range/range.go b/examples/range/range.go
index 7ae540d..011af67 100644
--- a/examples/range/range.go
+++ b/examples/range/range.go
@@ -8,41 +8,41 @@ import "fmt"
func main() {
- // Here we use `range` to sum the numbers in a slice.
- // Arrays work like this too.
- nums := []int{2, 3, 4}
- sum := 0
- for _, num := range nums {
- sum += num
- }
- fmt.Println("sum:", sum)
+ // Here we use `range` to sum the numbers in a slice.
+ // Arrays work like this too.
+ nums := []int{2, 3, 4}
+ sum := 0
+ for _, num := range nums {
+ sum += num
+ }
+ fmt.Println("sum:", sum)
- // `range` on arrays and slices provides both the
- // index and value for each entry. Above we didn't
- // need the index, so we ignored it with the
- // blank identifier `_`. Sometimes we actually want
- // the indexes though.
- for i, num := range nums {
- if num == 3 {
- fmt.Println("index:", i)
- }
- }
+ // `range` on arrays and slices provides both the
+ // index and value for each entry. Above we didn't
+ // need the index, so we ignored it with the
+ // blank identifier `_`. Sometimes we actually want
+ // the indexes though.
+ for i, num := range nums {
+ if num == 3 {
+ fmt.Println("index:", i)
+ }
+ }
- // `range` on map iterates over key/value pairs.
- kvs := map[string]string{"a": "apple", "b": "banana"}
- for k, v := range kvs {
- fmt.Printf("%s -> %s\n", k, v)
- }
+ // `range` on map iterates over key/value pairs.
+ kvs := map[string]string{"a": "apple", "b": "banana"}
+ for k, v := range kvs {
+ fmt.Printf("%s -> %s\n", k, v)
+ }
- // `range` can also iterate over just the keys of a map.
- for k := range kvs {
- fmt.Println("key:", k)
- }
+ // `range` can also iterate over just the keys of a map.
+ for k := range kvs {
+ fmt.Println("key:", k)
+ }
- // `range` on strings iterates over Unicode code
- // points. The first value is the starting byte index
- // of the `rune` and the second the `rune` itself.
- for i, c := range "go" {
- fmt.Println(i, c)
- }
+ // `range` on strings iterates over Unicode code
+ // points. The first value is the starting byte index
+ // of the `rune` and the second the `rune` itself.
+ for i, c := range "go" {
+ fmt.Println(i, c)
+ }
}
diff --git a/examples/range/range.hash b/examples/range/range.hash
index 571157c..2f8d0da 100644
--- a/examples/range/range.hash
+++ b/examples/range/range.hash
@@ -1,2 +1,2 @@
ebe328a57f3d34708709ca99d3304af1733592d9
-SkL_AS-1Jd
+JTY1VAUjfBw
diff --git a/examples/rate-limiting/rate-limiting.go b/examples/rate-limiting/rate-limiting.go
index f5eea19..175bbcc 100644
--- a/examples/rate-limiting/rate-limiting.go
+++ b/examples/rate-limiting/rate-limiting.go
@@ -11,59 +11,59 @@ import "fmt"
func main() {
- // First we'll look at basic rate limiting. Suppose
- // we want to limit our handling of incoming requests.
- // We'll serve these requests off a channel of the
- // same name.
- requests := make(chan int, 5)
- for i := 1; i <= 5; i++ {
- requests <- i
- }
- close(requests)
+ // First we'll look at basic rate limiting. Suppose
+ // we want to limit our handling of incoming requests.
+ // We'll serve these requests off a channel of the
+ // same name.
+ requests := make(chan int, 5)
+ for i := 1; i <= 5; i++ {
+ requests <- i
+ }
+ close(requests)
- // This `limiter` channel will receive a value
- // every 200 milliseconds. This is the regulator in
- // our rate limiting scheme.
- limiter := time.Tick(200 * time.Millisecond)
+ // This `limiter` channel will receive a value
+ // every 200 milliseconds. This is the regulator in
+ // our rate limiting scheme.
+ limiter := time.Tick(200 * time.Millisecond)
- // By blocking on a receive from the `limiter` channel
- // before serving each request, we limit ourselves to
- // 1 request every 200 milliseconds.
- for req := range requests {
- <-limiter
- fmt.Println("request", req, time.Now())
- }
+ // By blocking on a receive from the `limiter` channel
+ // before serving each request, we limit ourselves to
+ // 1 request every 200 milliseconds.
+ for req := range requests {
+ <-limiter
+ fmt.Println("request", req, time.Now())
+ }
- // We may want to allow short bursts of requests in
- // our rate limiting scheme while preserving the
- // overall rate limit. We can accomplish this by
- // buffering our limiter channel. This `burstyLimiter`
- // channel will allow bursts of up to 3 events.
- burstyLimiter := make(chan time.Time, 3)
+ // We may want to allow short bursts of requests in
+ // our rate limiting scheme while preserving the
+ // overall rate limit. We can accomplish this by
+ // buffering our limiter channel. This `burstyLimiter`
+ // channel will allow bursts of up to 3 events.
+ burstyLimiter := make(chan time.Time, 3)
- // Fill up the channel to represent allowed bursting.
- for i := 0; i < 3; i++ {
- burstyLimiter <- time.Now()
- }
+ // Fill up the channel to represent allowed bursting.
+ for i := 0; i < 3; i++ {
+ burstyLimiter <- time.Now()
+ }
- // Every 200 milliseconds we'll try to add a new
- // value to `burstyLimiter`, up to its limit of 3.
- go func() {
- for t := range time.Tick(200 * time.Millisecond) {
- burstyLimiter <- t
- }
- }()
+ // Every 200 milliseconds we'll try to add a new
+ // value to `burstyLimiter`, up to its limit of 3.
+ go func() {
+ for t := range time.Tick(200 * time.Millisecond) {
+ burstyLimiter <- t
+ }
+ }()
- // Now simulate 5 more incoming requests. The first
- // 3 of these will benefit from the burst capability
- // of `burstyLimiter`.
- burstyRequests := make(chan int, 5)
- for i := 1; i <= 5; i++ {
- burstyRequests <- i
- }
- close(burstyRequests)
- for req := range burstyRequests {
- <-burstyLimiter
- fmt.Println("request", req, time.Now())
- }
+ // Now simulate 5 more incoming requests. The first
+ // 3 of these will benefit from the burst capability
+ // of `burstyLimiter`.
+ burstyRequests := make(chan int, 5)
+ for i := 1; i <= 5; i++ {
+ burstyRequests <- i
+ }
+ close(burstyRequests)
+ for req := range burstyRequests {
+ <-burstyLimiter
+ fmt.Println("request", req, time.Now())
+ }
}
diff --git a/examples/reading-files/reading-files.go b/examples/reading-files/reading-files.go
index 807195f..bcff7fe 100644
--- a/examples/reading-files/reading-files.go
+++ b/examples/reading-files/reading-files.go
@@ -5,80 +5,80 @@
package main
import (
- "bufio"
- "fmt"
- "io"
- "io/ioutil"
- "os"
+ "bufio"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
)
// Reading files requires checking most calls for errors.
// This helper will streamline our error checks below.
func check(e error) {
- if e != nil {
- panic(e)
- }
+ if e != nil {
+ panic(e)
+ }
}
func main() {
- // Perhaps the most basic file reading task is
- // slurping a file's entire contents into memory.
- dat, err := ioutil.ReadFile("/tmp/dat")
- check(err)
- fmt.Print(string(dat))
+ // Perhaps the most basic file reading task is
+ // slurping a file's entire contents into memory.
+ dat, err := ioutil.ReadFile("/tmp/dat")
+ check(err)
+ fmt.Print(string(dat))
- // You'll often want more control over how and what
- // parts of a file are read. For these tasks, start
- // by `Open`ing a file to obtain an `os.File` value.
- f, err := os.Open("/tmp/dat")
- check(err)
+ // You'll often want more control over how and what
+ // parts of a file are read. For these tasks, start
+ // by `Open`ing a file to obtain an `os.File` value.
+ f, err := os.Open("/tmp/dat")
+ check(err)
- // Read some bytes from the beginning of the file.
- // Allow up to 5 to be read but also note how many
- // actually were read.
- b1 := make([]byte, 5)
- n1, err := f.Read(b1)
- check(err)
- fmt.Printf("%d bytes: %s\n", n1, string(b1))
+ // Read some bytes from the beginning of the file.
+ // Allow up to 5 to be read but also note how many
+ // actually were read.
+ b1 := make([]byte, 5)
+ n1, err := f.Read(b1)
+ check(err)
+ fmt.Printf("%d bytes: %s\n", n1, string(b1))
- // You can also `Seek` to a known location in the file
- // and `Read` from there.
- o2, err := f.Seek(6, 0)
- check(err)
- b2 := make([]byte, 2)
- n2, err := f.Read(b2)
- check(err)
- fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
+ // You can also `Seek` to a known location in the file
+ // and `Read` from there.
+ o2, err := f.Seek(6, 0)
+ check(err)
+ b2 := make([]byte, 2)
+ n2, err := f.Read(b2)
+ check(err)
+ fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
- // The `io` package provides some functions that may
- // be helpful for file reading. For example, reads
- // like the ones above can be more robustly
- // implemented with `ReadAtLeast`.
- o3, err := f.Seek(6, 0)
- check(err)
- b3 := make([]byte, 2)
- n3, err := io.ReadAtLeast(f, b3, 2)
- check(err)
- fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
+ // The `io` package provides some functions that may
+ // be helpful for file reading. For example, reads
+ // like the ones above can be more robustly
+ // implemented with `ReadAtLeast`.
+ o3, err := f.Seek(6, 0)
+ check(err)
+ b3 := make([]byte, 2)
+ n3, err := io.ReadAtLeast(f, b3, 2)
+ check(err)
+ fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
- // There is no built-in rewind, but `Seek(0, 0)`
- // accomplishes this.
- _, err = f.Seek(0, 0)
- check(err)
+ // There is no built-in rewind, but `Seek(0, 0)`
+ // accomplishes this.
+ _, err = f.Seek(0, 0)
+ check(err)
- // 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.
- r4 := bufio.NewReader(f)
- b4, err := r4.Peek(5)
- check(err)
- fmt.Printf("5 bytes: %s\n", string(b4))
+ // 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.
+ r4 := bufio.NewReader(f)
+ b4, err := r4.Peek(5)
+ check(err)
+ fmt.Printf("5 bytes: %s\n", string(b4))
- // Close the file when you're done (usually this would
- // be scheduled immediately after `Open`ing with
- // `defer`).
- f.Close()
+ // Close the file when you're done (usually this would
+ // be scheduled immediately after `Open`ing with
+ // `defer`).
+ f.Close()
}
diff --git a/examples/reading-files/reading-files.hash b/examples/reading-files/reading-files.hash
index c56535c..f687f38 100644
--- a/examples/reading-files/reading-files.hash
+++ b/examples/reading-files/reading-files.hash
@@ -1,2 +1,2 @@
2aa7a2e248065cebfa6f8eece3234b5ffa710273
-2kEKXq-kUV
+GQgp-I3dLb2
diff --git a/examples/recursion/recursion.go b/examples/recursion/recursion.go
index 417b3d8..a88b1e5 100644
--- a/examples/recursion/recursion.go
+++ b/examples/recursion/recursion.go
@@ -9,12 +9,12 @@ import "fmt"
// This `fact` function calls itself until it reaches the
// base case of `fact(0)`.
func fact(n int) int {
- if n == 0 {
- return 1
- }
- return n * fact(n-1)
+ if n == 0 {
+ return 1
+ }
+ return n * fact(n-1)
}
func main() {
- fmt.Println(fact(7))
+ fmt.Println(fact(7))
}
diff --git a/examples/recursion/recursion.hash b/examples/recursion/recursion.hash
index b867f04..2ebf561 100644
--- a/examples/recursion/recursion.hash
+++ b/examples/recursion/recursion.hash
@@ -1,2 +1,2 @@
5d1ba6b03a50ccae2a0f46865eb72c587e11857c
-RFn-rf42ap
+4yUp5wLVyiG
diff --git a/examples/regular-expressions/regular-expressions.go b/examples/regular-expressions/regular-expressions.go
index fa66f83..5d5ee8c 100644
--- a/examples/regular-expressions/regular-expressions.go
+++ b/examples/regular-expressions/regular-expressions.go
@@ -10,72 +10,72 @@ import "regexp"
func main() {
- // This tests whether a pattern matches a string.
- match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
- fmt.Println(match)
+ // This tests whether a pattern matches a string.
+ match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
+ fmt.Println(match)
- // Above we used a string pattern directly, but for
- // other regexp tasks you'll need to `Compile` an
- // optimized `Regexp` struct.
- r, _ := regexp.Compile("p([a-z]+)ch")
+ // Above we used a string pattern directly, but for
+ // other regexp tasks you'll need to `Compile` an
+ // optimized `Regexp` struct.
+ r, _ := regexp.Compile("p([a-z]+)ch")
- // Many methods are available on these structs. Here's
- // a match test like we saw earlier.
- fmt.Println(r.MatchString("peach"))
+ // Many methods are available on these structs. Here's
+ // a match test like we saw earlier.
+ fmt.Println(r.MatchString("peach"))
- // This finds the match for the regexp.
- fmt.Println(r.FindString("peach punch"))
+ // This finds the match for the regexp.
+ fmt.Println(r.FindString("peach punch"))
- // This also finds the first match but returns the
- // start and end indexes for the match instead of the
- // matching text.
- fmt.Println(r.FindStringIndex("peach punch"))
+ // This also finds the first match but returns the
+ // start and end indexes for the match instead of the
+ // matching text.
+ fmt.Println(r.FindStringIndex("peach punch"))
- // The `Submatch` variants include information about
- // both the whole-pattern matches and the submatches
- // within those matches. For example this will return
- // information for both `p([a-z]+)ch` and `([a-z]+)`.
- fmt.Println(r.FindStringSubmatch("peach punch"))
+ // The `Submatch` variants include information about
+ // both the whole-pattern matches and the submatches
+ // within those matches. For example this will return
+ // information for both `p([a-z]+)ch` and `([a-z]+)`.
+ fmt.Println(r.FindStringSubmatch("peach punch"))
- // Similarly this will return information about the
- // indexes of matches and submatches.
- fmt.Println(r.FindStringSubmatchIndex("peach punch"))
+ // Similarly this will return information about the
+ // indexes of matches and submatches.
+ fmt.Println(r.FindStringSubmatchIndex("peach punch"))
- // The `All` variants of these functions apply to all
- // matches in the input, not just the first. For
- // example to find all matches for a regexp.
- fmt.Println(r.FindAllString("peach punch pinch", -1))
+ // The `All` variants of these functions apply to all
+ // matches in the input, not just the first. For
+ // example to find all matches for a regexp.
+ fmt.Println(r.FindAllString("peach punch pinch", -1))
- // These `All` variants are available for the other
- // functions we saw above as well.
- fmt.Println(r.FindAllStringSubmatchIndex(
- "peach punch pinch", -1))
+ // These `All` variants are available for the other
+ // functions we saw above as well.
+ fmt.Println(r.FindAllStringSubmatchIndex(
+ "peach punch pinch", -1))
- // Providing a non-negative integer as the second
- // argument to these functions will limit the number
- // of matches.
- fmt.Println(r.FindAllString("peach punch pinch", 2))
+ // Providing a non-negative integer as the second
+ // argument to these functions will limit the number
+ // of matches.
+ fmt.Println(r.FindAllString("peach punch pinch", 2))
- // Our examples above had string arguments and used
- // names like `MatchString`. We can also provide
- // `[]byte` arguments and drop `String` from the
- // function name.
- fmt.Println(r.Match([]byte("peach")))
+ // Our examples above had string arguments and used
+ // names like `MatchString`. We can also provide
+ // `[]byte` arguments and drop `String` from the
+ // function name.
+ fmt.Println(r.Match([]byte("peach")))
- // When creating constants with regular expressions
- // you can use the `MustCompile` variation of
- // `Compile`. A plain `Compile` won't work for
- // constants because it has 2 return values.
- r = regexp.MustCompile("p([a-z]+)ch")
- fmt.Println(r)
+ // When creating constants with regular expressions
+ // you can use the `MustCompile` variation of
+ // `Compile`. A plain `Compile` won't work for
+ // constants because it has 2 return values.
+ r = regexp.MustCompile("p([a-z]+)ch")
+ fmt.Println(r)
- // The `regexp` package can also be used to replace
- // subsets of strings with other values.
- fmt.Println(r.ReplaceAllString("a peach", "
package main
package main
package main
package main
package main
go run hello.go
uses run
and
package main
package main
defer
is often used where e.g.
package main
package main
package main
package main
package main
for
loops.
package main
package main
package main
go build
.
$ go build hello-world.go
$ ls
-hello-world hello-world.go
+hello-world hello-world.go
package main
package main
package main
package main
package main
package main
package main
goroutine 1 [running]:
main.main()
- /.../panic.go:12 +0x47
+ /.../panic.go:12 +0x47
...
exit status 2
package main
package main
package main
package main
package main
package main
package main
real 0m2.245s
+ real 0m2.245s
package main
package main
package main
package main
package main
package main
package main
package main
package main
package main
real 0m2.358s
+ real 0m2.358s
package main