master
 1package main
 2
 3import (
 4	"fmt"
 5	"io"
 6	"os"
 7	"time"
 8)
 9
10type Sleeper interface {
11	Sleep()
12}
13
14type DefaultSleeper struct{}
15
16func (d *DefaultSleeper) Sleep() {
17	time.Sleep(1 * time.Second)
18}
19
20const finalWord = "Go!"
21const countdownStart = 3
22
23func Countdown(out io.Writer, sleeper Sleeper) {
24	for i := countdownStart; i > 0; i-- {
25		sleeper.Sleep()
26		fmt.Fprintln(out, i)
27	}
28
29	sleeper.Sleep()
30	fmt.Fprint(out, finalWord)
31}
32
33func main() {
34	sleeper := &DefaultSleeper{}
35	Countdown(os.Stdout, sleeper)
36}