Welcome to The Coding College!
In Go, the for loop is the only looping construct, but it’s incredibly versatile and can handle a wide range of scenarios. This guide will cover everything you need to know about for loops in Go, from basic syntax to advanced use cases.
Why Use for Loops?
for loops are used to execute a block of code repeatedly based on a condition. They are essential for tasks like iterating over collections, performing repetitive computations, and automating workflows.
Basic Syntax
for initialization; condition; post {
// Code to execute in each iteration
}- Initialization: Executes once before the loop starts (e.g.,
i := 0). - Condition: Evaluated before each iteration; the loop continues while this evaluates to
true. - Post: Executes after each iteration (e.g.,
i++).
Example: Basic for Loop
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i) // Output: 0 1 2 3 4
}
}Types of for Loops in Go
Go supports various types of for loops to handle different scenarios.
1. Standard for Loop
for initialization; condition; post {
// Loop body
}Example:
for i := 1; i <= 10; i++ {
fmt.Printf("Square of %d is %d\n", i, i*i)
}2. Condition-Only Loop
You can omit the initialization and post statements for a simpler loop.
Example:
i := 1
for i <= 5 {
fmt.Println(i) // Output: 1 2 3 4 5
i++
}3. Infinite Loop
By omitting all three parts, you create an infinite loop.
Example:
for {
fmt.Println("This will run forever")
break // Use break to exit the loop
}4. Range-Based Loop
The range keyword is used to iterate over collections like arrays, slices, maps, and strings.
Example: Iterating Over a Slice
numbers := []int{10, 20, 30, 40, 50}
for index, value := range numbers {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}Example: Iterating Over a String
word := "GoLang"
for index, char := range word {
fmt.Printf("Index: %d, Character: %c\n", index, char)
}Control Statements in for Loops
Go provides break and continue to control the flow of loops.
1. break Statement
Exits the loop immediately.
Example:
for i := 1; i <= 10; i++ {
if i == 5 {
break // Exit the loop when i is 5
}
fmt.Println(i)
}2. continue Statement
Skips the current iteration and moves to the next one.
Example:
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue // Skip even numbers
}
fmt.Println(i) // Output: 1 3 5 7 9
}Nested for Loops
You can nest for loops to handle multi-dimensional data or complex logic.
Example: Multiplication Table
for i := 1; i <= 3; i++ {
for j := 1; j <= 3; j++ {
fmt.Printf("%d * %d = %d\n", i, j, i*j)
}
}Practical Examples
Example 1: Sum of Numbers
sum := 0
for i := 1; i <= 10; i++ {
sum += i
}
fmt.Println("Sum:", sum) // Output: Sum: 55Example 2: Iterating Over a Map
person := map[string]string{
"name": "Alice",
"country": "USA",
"job": "Developer",
}
for key, value := range person {
fmt.Printf("%s: %s\n", key, value)
}Example 3: Finding Prime Numbers
for num := 2; num <= 20; num++ {
isPrime := true
for i := 2; i < num; i++ {
if num%i == 0 {
isPrime = false
break
}
}
if isPrime {
fmt.Println(num, "is a prime number")
}
}Best Practices for for Loops
- Limit Nesting
- Avoid deeply nested loops; refactor complex logic into functions.
- Use
rangefor Collectionsrangesimplifies iteration over arrays, slices, and maps.
- Optimize Condition Checks
- Ensure the loop condition is efficient to avoid performance issues.
- Avoid Infinite Loops
- Use infinite loops (
for {}) cautiously and include exit conditions.
- Use infinite loops (
Common Mistakes
- Off-by-One Errors
- Carefully define loop bounds to avoid missing or extra iterations.
for i := 0; i < 10; i++ { // Correct- Unoptimized Conditions
- Avoid complex or redundant conditions inside loops.
- Skipping Initialization
- Forgetting to initialize loop variables can lead to undefined behavior.
Conclusion
Go’s for loop is versatile, allowing you to handle simple iterations, collection traversal, and complex logic. By understanding its features and applying best practices, you can write efficient and readable loops in your programs.