
rgerardi
Powerful Command-Line Applications in Go Book Club
Hello all.
Creating this space here for general discussion and chat about Powerful Command-Line Applications In Go
In particular, we can use this topic as an entry point to share and discuss solutions to the book’s exercises. Thanks @adamwoolhether for the suggestion!
Most Liked

Fernando
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
}

rgerardi

adamwoolhether
Hi @rgerardi, thanks again for setting this up.
I’ll pop in and help reply to questions for exercises I’ve solved. I can get most of them, but am at a loss with #2 & #3 for Chapter 2.
I’m assuming that solving these requires implement the Formatter
interface, and calling it in main
with fmt.Printf
?
Or do I write another custom method to call in the case that my verbose
or incomplete
flag bools are selected?
Popular General Dev topics









Other popular topics










Latest in General Dev
Latest (all)
Categories:
Popular Portals
- /elixir
- /opensuse
- /rust
- /erlang
- /ruby
- /python
- /kotlin
- /clojure
- /react
- /go
- /js
- /react-native
- /swift
- /haskell
- /quarkus
- /debian
- /v
- /tailwind
- /vapor
- /gleam
- /nodejs
- /crystal
- /flutter
- /symfony
- /agda
- /julia
- /ubuntu
- /slackware
- /adonisjs
- /angular
- /php
- /ash
- /neovim
- /deepseek
- /c
- /grails
- /c-sharp
- /nest
- /diversity
- /revery
- /rubymotion
- /perl
- /giraffe
- /prolog
- /flask
- /amber
- /kemal
- /yew
- /hamler
- /groovy
- /lapis
- /fika
- /java
- /ocaml
- /c-plus-plus
- /security
- /typescript
- /zotonic
- /deno
- /wasm