I am going through the book without knowing any go programming.
“Exercises
You can improve your understanding of the concepts discussed here by doing these exercises:
Add another command-line flag, -b, to count the number of bytes in addition to words and lines.
Then, update the count function to accept another parameter, countBytes. When this input parameter is set to true, the function should count bytes. (Hint: check all the methods available for the type bufio.Scanner in the Go documentation.[12])
Write tests to ensure the new feature works as intended.”
Excerpt From: Ricardo Gerardi. “Powerful Command-Line Applications in Go.”
Test:
cat main_test.go
package main
import (
"bytes"
"testing"
)
func TestCountWords(t *testing.T) {
b := bytes.NewBufferString("word1 word2 word3 word4\n")
exp := 4
res := count(b, false, false)
if res != exp {
t.Errorf("Expected %d, got %d instead.\n", exp, res)
}
}
func TestCountLines(t *testing.T) {
b := bytes.NewBufferString("word1 word2 word3\nline2\nline3 word1")
exp := 3
res := count(b, true, false)
if res != exp {
t.Errorf("Expected %d, got %d instead.\n", exp, res)
}
}
func TestCountBytes(t *testing.T) {
b := bytes.NewBufferString("word1 word2 word3\n")
exp := 18
res := count(b, false, true)
if res != exp {
t.Errorf("Expected %d, got %d instead.\n", exp, res)
}
}
cat main.go
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func main() {
lines := flag.Bool("l", false, "Count lines")
bytes := flag.Bool("b", false, "Count bytes")
flag.Parse()
fmt.Println(count(os.Stdin, *lines, *bytes))
}
func count(r io.Reader, countLines bool, countBytes bool) int {
scanner := bufio.NewScanner(r)
if !countLines && !countBytes {
scanner.Split(bufio.ScanWords)
}
if countBytes {
scanner.Split(bufio.ScanBytes)
}
wc := 0
for scanner.Scan() {
wc++
}
return wc
}