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)
}
▶ Open Go Playground

Copy the code above and paste to run

© 2026 ByteLearn.dev. Free courses for developers. · Privacy