WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Go · Intermediate · question 21 of 100

Can you explain how concurrency is achieved in Go? What are the benefits of this approach?

📕 Buy this interview preparation book: 100 Go questions & answers — PDF + EPUB for $5

Concurrency in Go is achieved through goroutines, channels, and the ‘select‘ statement. These features allow for multiple tasks to be executed concurrently and efficiently, making use of multiple CPU cores and parallel execution.

1. Goroutines:

Goroutines are lightweight threads managed by the Go runtime. They facilitate concurrent execution of functions or methods. To start a goroutine, simply use the ‘go‘ statement followed by the function or method’s name.

For example:

func printNumbers() {
    for i := 0; i < 5; i++ {
        fmt.Println("Number:", i)
    }
}

func main() {
    go printNumbers()

    for i := 0; i < 5; i++ {
        fmt.Println("Main:", i)
    }

    time.Sleep(1 * time.Second) // Adding sleep so that both the loops finish execution.
}

2. Channels:

Channels are used for communication and synchronization between goroutines. They can pass data between goroutines and can be thought of as a pipe that connects two goroutines. You can create channels using the ‘make‘ function.

For example:

package main

import (
    "fmt"
    "time"
)

func printNumbers(c chan int) {
    for i := 0; i < 5; i++ {
        time.Sleep(1 * time.Millisecond)
        c <- i // Send i to the channel.
    }
}

func main() {
    c := make(chan int)

    go printNumbers(c)

    for i := 0; i < 5; i++ {
        num := <-c // Receive value from the channel.
        fmt.Println("Received number:", num)
    }
}

3. Select statement:

The ‘select‘ statement is used to handle multiple channel operations concurrently. It works like a switch statement but for channels.

For example:

package main

import (
    "fmt"
    "time"
)

func send(channel chan<- int, wait time.Duration, value int) {
    time.Sleep(wait)
    channel <- value
}

func main() {
    a := make(chan int)
    b := make(chan int)

    go send(a, 3*time.Second, 3)
    go send(b, 5*time.Second, 5)

    for i := 0; i < 2; i++ {
        select {
        case value := <-a:
            fmt.Println("Received from channel a:", value)
        case value := <-b:
            fmt.Println("Received from channel b:", value)
        }
    }
}

Benefits of Go’s concurrency model:

1. Scalability: Goroutines use less memory compared to traditional threads, which means that Go programs can create thousands or even millions of goroutines without consuming excessive system resources.

2. Simplified error handling: Using channels for communication helps to avoid race conditions and simplifies error handling as Go’s channels enforce a "share by communicating" paradigm.

3. Readability: The ‘select‘ statement and ‘go‘ keyword provide simple and clean syntax for concurrent programming, which makes Go programs easier to read and understand.

4. Efficiency: Go’s runtime multiplexes goroutines onto the available OS threads, achieving efficient use of multiple CPU cores and parallel execution.

In conclusion, Go’s concurrency model provides a powerful and efficient way to handle concurrent tasks that is also easy to understand and implement. The use of goroutines, channels, and select statements simplifies the coding and debugging process for concurrent programs, allowing developers to create more complex and powerful applications with ease.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Go interview — then scores it.
📞 Practice Go — free 15 min
📕 Buy this interview preparation book: 100 Go questions & answers — PDF + EPUB for $5

All 100 Go questions · All topics