Without time.Sleep(), the execution of goroutines isn't interleaved. It might also be worth noting in this early example why a Scanln is required—main() won't wait for goroutines to finish and since they're returned immediately getting to the end of main() ends the execution.
➜ goroutines git:(master) go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
goroutine : 1
goroutine : 2
going
done
Without time.Sleep(), the execution of goroutines isn't interleaved. It might also be worth noting in this early example why a Scanln is required—main() won't wait for goroutines to finish and since they're returned immediately getting to the end of main() ends the execution.