Tutorial exercises
Alan A. A. Donovan and Brian W. Kernighan, The Go Programming Language. Addison-Wesley, 2016, Chapter 1, Tutorial
See also Go: getting oriented
Exercise 1.1
Modify the echo program to also print os.Args[0], the name of the
command that invoked it.
1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"os"
"strings"
)
func main() {
fmt.Print(os.Args[0] + " ")
fmt.Println(strings.Join(os.Args[1:], " "))
}
Exercise 1.2
Modify the echo program to print the index and value of each of its
arguments, one per line.
1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"os"
)
func main() {
for idx, elt := range os.Args {
fmt.Println(idx, elt)
}
}
Exercise 1.3
Experiment to measure the difference in running time between our potentially
inefficient versions and the one that uses strings.Join. (Section 1.6
illustrates part of the time package, and Section 11.4 shows how to write
benchmark tests for systematic performance evaluation.)
Solution 1
Using time:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main
import (
"fmt"
"os"
"strings"
"time"
)
func args1() {
var s, sep string
for i := 1; i < len(os.Args); i++ {
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
}
func args2() {
fmt.Println(strings.Join(os.Args, " "))
}
func main() {
start := time.Now()
args1()
fmt.Printf("%0.2f s elapsed\n", time.Since(start).Seconds())
start = time.Now()
args2()
fmt.Printf("%0.2f s elapsed\n", time.Since(start).Seconds())
}
Solution 2
Using benchmark functions included in a test file:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import "testing"
func BenchmarkArgs1(b *testing.B) {
for i := 0; i < b.N; i++ {
args1()
}
}
func BenchmarkArgs2(b *testing.B) {
for i := 0; i < b.N; i++ {
args2()
}
}