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.
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.
I can explain what your code has actually done,step by step:
collectInt
, it's empty.ok, you might know why step 2 print an empty slice