From 562f33073053f92e5d1995a9b2b16057d03210b3 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:08:27 +0000 Subject: gcd.go: go fmt --- gcd.go | 59 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/gcd.go b/gcd.go index 04f772d..429c22e 100644 --- a/gcd.go +++ b/gcd.go @@ -23,39 +23,38 @@ import "fmt" import "flag" import "strconv" -func gcd2 (a, b uint) uint { - if b == 0 { - return a - } - /* 6g issues an error "function ends without a return statement", - if we use if ... {... return} else {... return}. - But GCC doesn't. - */ - return gcd2(b, a % b) +func gcd2(a, b uint) uint { + if b == 0 { + return a + } + /* 6g issues an error "function ends without a return statement", + if we use if ... {... return} else {... return}. + But GCC doesn't. + */ + return gcd2(b, a%b) } -func gcdn (ns []uint) uint { - var r uint // zero by default - for i := range ns { - r = gcd2(r, ns[i]) - } - return r +func gcdn(ns []uint) uint { + var r uint // zero by default + for i := range ns { + r = gcd2(r, ns[i]) + } + return r } func main() { - flag.Parse() // without this 6g will give flag.NArg() = 0 next (WTF?) - n := flag.NArg() - if n > 0 { - ns := make([]uint, n) // We have garbage collector! - - // Or: for i := range ns, since range of ns is equal to flag.NArg() - for i := 0; i < n; i++ { - // Drop the second return value (error code): - ns[i], _ = strconv.Atoui(flag.Arg(i)) - } - - g := gcdn(ns) - fmt.Printf("%v\n", g) - } + flag.Parse() // without this 6g will give flag.NArg() = 0 next (WTF?) + n := flag.NArg() + if n > 0 { + ns := make([]uint, n) // We have garbage collector! + + // Or: for i := range ns, since range of ns is equal to flag.NArg() + for i := 0; i < n; i++ { + // Drop the second return value (error code): + ns[i], _ = strconv.Atoui(flag.Arg(i)) + } + + g := gcdn(ns) + fmt.Printf("%v\n", g) + } } - -- cgit v1.2.3 From 15f2c46559bf98cc10327cfc33d292fe1be5213a Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:11:50 +0000 Subject: gcd.go: update to Go1. Use uint64 instead of uint, because strconv.ParseUint returns uint64, and there's no reason to artificially limit the tool to uint (which is now 32 bits) --- gcd.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gcd.go b/gcd.go index 429c22e..2b2bd3d 100644 --- a/gcd.go +++ b/gcd.go @@ -23,7 +23,7 @@ import "fmt" import "flag" import "strconv" -func gcd2(a, b uint) uint { +func gcd2(a, b uint64) uint64 { if b == 0 { return a } @@ -34,8 +34,8 @@ func gcd2(a, b uint) uint { return gcd2(b, a%b) } -func gcdn(ns []uint) uint { - var r uint // zero by default +func gcdn(ns []uint64) uint64 { + var r uint64 // zero by default for i := range ns { r = gcd2(r, ns[i]) } @@ -46,12 +46,12 @@ func main() { flag.Parse() // without this 6g will give flag.NArg() = 0 next (WTF?) n := flag.NArg() if n > 0 { - ns := make([]uint, n) // We have garbage collector! + ns := make([]uint64, n) // We have garbage collector! // Or: for i := range ns, since range of ns is equal to flag.NArg() for i := 0; i < n; i++ { // Drop the second return value (error code): - ns[i], _ = strconv.Atoui(flag.Arg(i)) + ns[i], _ = strconv.ParseUint(flag.Arg(i), 0, 64) } g := gcdn(ns) -- cgit v1.2.3 From d0fb3e61b938858a05e7b47fc8c242783582b440 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:17:56 +0000 Subject: Update build instructions, because Go 1 does not expose 6g / 8g / etc tools and has the unified Go command --- gcd.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gcd.go b/gcd.go index 2b2bd3d..e111cc0 100644 --- a/gcd.go +++ b/gcd.go @@ -5,10 +5,11 @@ # gccgo gcd.go -o gcd-go # ./gcd-go 11 22 33 44 121 - With Google Go (6g for amd64, 8g for x86, http://golang.org/cmd/): - # 6g -o gcd-go.o gcd.go - # 6l -o gcd-go-6g gcd-go.o - # ./gcd-go-6g 11 22 33 44 121 + With Google Go (http://golang.org/): + # go run gcd.go 11 22 33 44 121 + # or, if you want to play with the binary + # go build -o gcd-go gcd.go + # ./gcd-go 11 22 33 44 121 GCC makes dynamically linked binary, but Google Go - statically linked -- cgit v1.2.3 From 6933b5bcf9635020acb56ba171768ae4ae375642 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:19:33 +0000 Subject: Make the program more idiomatic to Go (pass 1) --- gcd.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gcd.go b/gcd.go index e111cc0..62a024b 100644 --- a/gcd.go +++ b/gcd.go @@ -20,9 +20,11 @@ package main // Both Google Go and GCC issue an error "imported and not used", // if imported and not used :-) -import "fmt" -import "flag" -import "strconv" +import ( + "flag" + "fmt" + "strconv" +) func gcd2(a, b uint64) uint64 { if b == 0 { @@ -35,12 +37,11 @@ func gcd2(a, b uint64) uint64 { return gcd2(b, a%b) } -func gcdn(ns []uint64) uint64 { - var r uint64 // zero by default +func gcdn(ns []uint64) (r uint64) { for i := range ns { r = gcd2(r, ns[i]) } - return r + return } func main() { -- cgit v1.2.3 From e6b19e29cb859745913923715496c841ea27b8a4 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:32:37 +0000 Subject: Don't use flag package, because in this case we only want raw arguments. Use os.Args instead. Make use of append() --- gcd.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/gcd.go b/gcd.go index 62a024b..21e5371 100644 --- a/gcd.go +++ b/gcd.go @@ -21,8 +21,8 @@ package main // Both Google Go and GCC issue an error "imported and not used", // if imported and not used :-) import ( - "flag" "fmt" + "os" "strconv" ) @@ -45,18 +45,14 @@ func gcdn(ns []uint64) (r uint64) { } func main() { - flag.Parse() // without this 6g will give flag.NArg() = 0 next (WTF?) - n := flag.NArg() - if n > 0 { - ns := make([]uint64, n) // We have garbage collector! - - // Or: for i := range ns, since range of ns is equal to flag.NArg() - for i := 0; i < n; i++ { - // Drop the second return value (error code): - ns[i], _ = strconv.ParseUint(flag.Arg(i), 0, 64) - } - - g := gcdn(ns) - fmt.Printf("%v\n", g) + if len(os.Args) == 0 { + return } + var ns []uint64 // We have garbage collector! + for _, arg := range os.Args { + // Drop the second return value (error code): + v, _ := strconv.ParseUint(arg, 0, 64) + ns = append(ns, v) + } + fmt.Printf("%v\n", gcdn(ns)) } -- cgit v1.2.3 From 63065370ef5f25916704c83bd50c092968f68d53 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:34:13 +0000 Subject: Use the power of Go for loop --- gcd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gcd.go b/gcd.go index 21e5371..fbd8c6a 100644 --- a/gcd.go +++ b/gcd.go @@ -38,8 +38,8 @@ func gcd2(a, b uint64) uint64 { } func gcdn(ns []uint64) (r uint64) { - for i := range ns { - r = gcd2(r, ns[i]) + for _, v := range ns { + r = gcd2(r, v) } return } -- cgit v1.2.3 From aafd8938e95ba03f6c84c9cd3b0b79b648d5836b Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:35:19 +0000 Subject: gcd.go: skip os.Args[0] which is the path to the binary --- gcd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gcd.go b/gcd.go index fbd8c6a..ede8be7 100644 --- a/gcd.go +++ b/gcd.go @@ -45,11 +45,11 @@ func gcdn(ns []uint64) (r uint64) { } func main() { - if len(os.Args) == 0 { + if len(os.Args) == 1 { return } var ns []uint64 // We have garbage collector! - for _, arg := range os.Args { + for _, arg := range os.Args[1:] { // Drop the second return value (error code): v, _ := strconv.ParseUint(arg, 0, 64) ns = append(ns, v) -- cgit v1.2.3 From 63c82ffa82536cda16370e80bed7f6e502cdfd36 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Fri, 30 Mar 2012 21:39:09 +0000 Subject: gcd.go: drop unused comments --- gcd.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/gcd.go b/gcd.go index ede8be7..96f601b 100644 --- a/gcd.go +++ b/gcd.go @@ -18,8 +18,6 @@ package main -// Both Google Go and GCC issue an error "imported and not used", -// if imported and not used :-) import ( "fmt" "os" @@ -30,10 +28,6 @@ func gcd2(a, b uint64) uint64 { if b == 0 { return a } - /* 6g issues an error "function ends without a return statement", - if we use if ... {... return} else {... return}. - But GCC doesn't. - */ return gcd2(b, a%b) } -- cgit v1.2.3