1

I'm using go routines to do fast execution. I'm making a sample program for practice but I'm wondered when I see that the value of the variable empty after assigning in the go routines. I'm showing my code:-

package main

import (
    "fmt"
)

func main() {
    var collectInt []int
    doneChan := make(chan string)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt = append(collectInt, i)
        }

    }()
    fmt.Println(collectInt)
    go func() {
        doneChan <- "done"
    }()
    <-doneChan
}

Play link https://play.golang.org/p/VgwrzR8GBzN

Please tell me that how I will assign the value to the variable while using go routines.

puneet55667788
  • 89
  • 2
  • 10
  • 1
    "value of the variable empty after assigning in the go routines" You don't print collectInt after it is assigned. You print it after some goroutine that will eventually assign it is scheduled (but not necessarily executing!) Also note that goroutines are not a go-fast button. Even if all errors are fixed, this program would likely be faster if everything happened in main. – Peter Jan 31 '19 at 07:51

2 Answers2

3

The rule is not to share data with shared variables but to pass the data between go routines with channels.

See Go proverbs

Don't communicate by sharing memory, share memory by communicating.

Either make a collectInt a channel and pass each int separately:

package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt <- i
        }
        close(collectInt)
    }()
    for i := range collectInt {
        fmt.Println(i)
    }
}

Or pass the whole set of data with a channel:

package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan []int)
    go func() {
        var ints []int
        for i := 0; i < 10; i++ {
            ints = append(ints, i)
        }
        collectInt <- ints
    }()
    fmt.Println(<-collectInt)
}

The doneChan has no use in this case.

Grzegorz Żur
  • 47,257
  • 14
  • 109
  • 105
1

I can explain what your code has actually done,step by step:

  1. delare and malloc for an slice collectInt, it's empty.
  2. fmt.Println() the empty slice.
  3. randomly execute two goroutine. The first goroutine might fail because once the second goroutine exec first, main routine stops.

ok, you might know why step 2 print an empty slice

fwhez
  • 561
  • 4
  • 10