Skip to content

Print Odd and Even Sequentially using Two Goroutine

Using Two Channels

package main

import (
    "fmt"
    "sync"
)

func main() {
    n := 10
    chOdd := make(chan bool)
    chEven := make(chan bool)
    var wg sync.WaitGroup
    wg.Add(2)
    go odd(n, chOdd, chEven, &wg)
    go even(n, chOdd, chEven, &wg)
    wg.Wait()
}

func odd(n int, chOdd chan bool, chEven chan bool, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 1; i <= n; i = i + 2 {
        fmt.Println(i)
        chEven <- true
        <-chOdd
    }
}

func even(n int, chOdd chan bool, chEven chan bool, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 2; i <= n; i = i + 2 {
        <-chEven
        fmt.Println(i)
        chOdd <- true
    }
}

Output:
1
2
3
4
5
6
7
8
9
10

Using One Channel

package main

import (
    "fmt"
    "sync"
)

func main() {
    c := make(chan int)
    var wg sync.WaitGroup
    wg.Add(2)
    go odd(c, &wg)
    go even(c, &wg)
    wg.Wait()
}

func even(c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 1; i <= 10; i++ {
        <-c
        if i%2 == 0 {
            fmt.Println(i)
        }
    }
}

func odd(c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 1; i <= 10; i++ {
        c <- 1
        if i%2 == 1 {
            fmt.Println(i)
        }
    }
}