DEV Community

Cover image for For, Four Ways: Mastering Loops in Go
Quinterabok
Quinterabok

Posted on

For, Four Ways: Mastering Loops in Go

Go's elegance lies in its simplicity. While other languages offer multiple looping constructs (while, do-while, for, etc.), Go streamlines everything into a single, versatile keyword: for. Don't let this simplicity fool you—Go's for loop is remarkably flexible and powerful. Let's explore four essential ways to harness its capabilities.

1. The Classic For Loop

The traditional C-style for loop consists of three components: initialization, condition, and post-statement. This is perfect when you need precise control over your iteration:

func main() {
    // Print numbers from 1 to 5
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
    }
}
Enter fullscreen mode Exit fullscreen mode

Here's what each component does:

i := 1 - Initializes the counter
i <= 5 - Defines the continuing condition
i++ - Executes after each iteration

2. The While-Style Loop

Need a while loop? In Go, it's just a for loop with a condition. Simply omit the initialization and post statements:

func main() {
    for {
        fmt.Println("Forever and ever...")
        time.Sleep(time.Second)
        // Use 'break' to exit when needed
        if someCondition {
            break
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

This pattern is common in server programs, event listeners, and game loops.

3. The Infinite Loop

Sometimes you need a loop that runs indefinitely (until broken). Go makes this remarkably clean:

func main() {
    for {
        fmt.Println("Forever and ever...")
        time.Sleep(time.Second)
        // Use 'break' to exit when needed
        if someCondition {
            break
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

This pattern is common in server programs, event listeners, and game loops.

4. Range-Based Loop

The range keyword is your best friend when working with collections. It provides a clean way to iterate over arrays, slices, maps, strings, and channels:

// Iterating over a slice
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

// Iterating over a map
ages := map[string]int{
    "Alice": 25,
    "Bob":   30,
    "Carol": 35,
}
for name, age := range ages {
    fmt.Printf("%s is %d years old\n", name, age)
}
Enter fullscreen mode Exit fullscreen mode

The range form automatically handles the details of iteration, making your code more readable and less prone to errors.

Best Practices and Tips

1.Choose the Right Form:

Select the loop style that best fits your use case. Don't use a classic for loop when range would be clearer.

2.Break and Continue:

Remember you can use break to exit a loop early and continue to skip to the next iteration:

for i := 1; i <= 10; i++ {
    if i%2 == 0 {
        continue  // Skip even numbers
    }
    if i > 7 {
        break     // Stop after 7
    }
    fmt.Println(i)
}
Enter fullscreen mode Exit fullscreen mode

3. Label Your Loops:

When working with nested loops, labels can help control which loop to break or continue:

outer:
    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            if i*j > 4 {
                break outer
            }
            fmt.Printf("i=%d, j=%d\n", i, j)
        }
    }
Enter fullscreen mode Exit fullscreen mode

Conclusion

Go's for loop might seem basic at first glance, but its flexibility makes it a powerful tool in your programming arsenal. By mastering these four patterns, you'll be able to handle any iteration need that comes your way, from simple counting to complex data structure traversal.

Top comments (0)