Golang for Loop

From Fundamentals to Advanced Techniques, Concurrency, and Channels

Harendra Kumar
4 min readNov 30, 2023

The ‘for’ loop is a cornerstone of Go programming, allowing developers to iterate, alter data, and choreograph the flow of their programmes. In this comprehensive book, we will explore the complexities of the Golang ‘for’ loop. This article will teach you all you need to know about the Golang ‘for’ loop, from the fundamentals of iterating over slices and arrays to advanced approaches for dealing with concurrency and channels.

Understanding the Basics

Let’s start by looking at the core syntax and applications of the Golang ‘for’ loop.

Basic Syntax:

The basic structure of a for loop in Go is refreshingly simple:

for initialization; condition; post {
// loop body
}

`initialization`` is called once before the loop begins, ‘condition’ is called before each iteration, and ‘post’ is called after each iteration.

  • This loop prints numbers from 0 to 4.

Iterating Over Collections:

One of the primary use cases for the for loop is iterating over collections like arrays or slices.

// Example of iterating over a slice
fruits := []string{"apple", "banana", "orange"}
for index, value := range fruits {
fmt.Printf("Index: %d, Value: %s\n", index, value)
}

The range keyword allows you to iterate over each element in the collection, providing both the index and value.

Advanced Techniques

As you become comfortable with the basics, let’s explore advanced techniques that elevate the Golang for loop's capabilities.

Infinite Loops:

Golang allows you to create infinite loops easily. This can be useful for scenarios where you need continuous execution until a specific condition is met.

// Example of an infinite loop
counter := 0
for {
fmt.Println("Executing forever")
counter++
if counter == 3 {
break
}
}

The break statement is used to exit the loop when a certain condition is satisfied.

Skipping Iterations:

The continue statement lets you skip the rest of the loop's body and move to the next iteration.

// Example of using continue
for i := 0; i < 5; i++ {
if i == 2 {
continue
}
fmt.Println(i)
}

This loop prints numbers from 0 to 4, skipping the iteration when i is equal to 2.

Concurrency with Goroutines

Golang’s concurrency model, based on goroutines and channels, pairs seamlessly with the for loop.

Goroutines and the for Loop:

Goroutines are lightweight threads that enable concurrent execution. The for loop is often employed to launch multiple goroutines concurrently.

// Example of using goroutines with for loop
for i := 0; i < 3; i++ {
go func(number int) {
fmt.Println("Goroutine:", number)
}(i)
}

This creates three goroutines, each printing its corresponding number.

Wait Groups:

The sync package provides a WaitGroup type to synchronize goroutines. It ensures that the program waits for all goroutines to finish before proceeding.

// Example of using WaitGroup with goroutines and for loop
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func(number int) {
defer wg.Done()
fmt.Println("Goroutine:", number)
}(i)
}
wg.Wait()

The Add method increments the counter, and Done decrements it when a goroutine completes. The Wait method halts the program until the counter becomes zero.

Channeling Communication

Channels provide a powerful means of communication between goroutines, and the for loop becomes a valuable tool in managing data flow.

Basic Channel Usage:

Channels facilitate communication between goroutines. In the example below, a channel is used to send and receive messages.

// Example of using channels with for loop
messages := make(chan string)
go func() {
for i := 0; i < 3; i++ {
messages <- fmt.Sprintf("Message %d", i)
}
close(messages)
}()
for msg := range messages {
fmt.Println(msg)
}

The close statement is essential when you finish sending data on a channel to avoid deadlocks.

Select Statement:

The select statement allows goroutines to wait on multiple communication operations. This is beneficial when dealing with multiple channels.

// Example of using select with for loop
channel1 := make(chan string)
channel2 := make(chan string)
go func() {
for {
time.Sleep(time.Second)
channel1 <- "Channel 1"
}
}()
go func() {
for {
time.Sleep(2 * time.Second)
channel2 <- "Channel 2"
}
}()
for {
select {
case msg1 := <-channel1:
fmt.Println(msg1)
case msg2 := <-channel2:
fmt.Println(msg2)
}
}

The select statement helps manage multiple channels concurrently.

Conclusion

We’ve advanced from the basics of iteration to advanced methods using parallelism and channels in this complete examination of the Golang ‘for’ loop. With its variety and simplicity, the ‘for’ loop remains a reliable tool for Golang developers.

Remember that practise is the key to mastering as you incorporate these strategies into your Golang projects. Experiment with various scenarios, test the limits of concurrency, and use channels to coordinate smooth communication.

By learning the Golang ‘for’ loop, you can develop code that is efficient, concurrent, and expressive. May your ‘for’ loops be in perpetuity efficient, your code expressive, and your programmes a tribute to the strength of Go’s simplicity and concurrency as you begin on your Golang adventure.

Originally published at https://golang.withcodeexample.com.

--

--

Harendra Kumar

Hello, I am full stack software developer from last 6+ years, I love to learn and share about programming.