FizzBuzz Variations
Three FizzBuzz implementations showing Go's control flow versatility: classic if/else, expression-less switch, and a version using labeled loops with early termination.
package main
import "fmt"
func fizzBuzzIfElse(n int) string {
if n%15 == 0 {
return "FizzBuzz"
} else if n%3 == 0 {
return "Fizz"
} else if n%5 == 0 {
return "Buzz"
}
return fmt.Sprintf("%d", n)
}
func fizzBuzzSwitch(n int) string {
switch {
case n%15 == 0:
return "FizzBuzz"
case n%3 == 0:
return "Fizz"
case n%5 == 0:
return "Buzz"
default:
return fmt.Sprintf("%d", n)
}
}
func fizzBuzzLabeled(limit int, stopAt string) {
fmt.Printf("\nLabeled loop (stop at first %q):\n", stopAt)
outer:
for i := 1; i <= limit; i++ {
result := fizzBuzzSwitch(i)
switch {
case result == stopAt:
fmt.Printf(" %d: %s <- found it, stopping!\n", i, result)
break outer
default:
fmt.Printf(" %d: %s\n", i, result)
}
}
}
func main() {
fmt.Println("=== If/Else version (1-20) ===")
for i := 1; i <= 20; i++ {
fmt.Printf(" %2d: %s\n", i, fizzBuzzIfElse(i))
}
fmt.Println("\n=== Switch version (1-20) ===")
for i := 1; i <= 20; i++ {
fmt.Printf(" %2d: %s\n", i, fizzBuzzSwitch(i))
}
// Labeled loop: stop at first FizzBuzz
fizzBuzzLabeled(30, "FizzBuzz")
// Count occurrences using a for loop with no condition (while-style)
fizzes, buzzes, fizzbuzzes := 0, 0, 0
i := 1
for i <= 100 {
switch fizzBuzzSwitch(i) {
case "Fizz":
fizzes++
case "Buzz":
buzzes++
case "FizzBuzz":
fizzbuzzes++
}
i++
}
fmt.Printf("\nStats for 1-100: Fizz=%d, Buzz=%d, FizzBuzz=%d\n", fizzes, buzzes, fizzbuzzes)
}