I want my code to print:
12AB34CD56EF78GH910IJ
but it prints:
12AB3456CDEF78910GHIJ
I am so confused and I think it is strange.
package main
import (
"fmt"
"sync"
)
func main() {
numdone := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
data := []byte("ABCDEFGHIJ")
for i := 0; i < 10; i = i + 2 {
<-numdone
fmt.Printf("%c", data[i])
fmt.Printf("%c", data[i+1])
}
}()
wg.Add(1)
go func() {
defer wg.Done()
for i := 1; i < 11; i = i + 2 {
fmt.Printf("%d", i)
fmt.Printf("%d", i+1)
numdone <- i
}
}()
wg.Wait()
}
Please read my comment above. To synchronize, just use a mutex and it'll work:
package main
import (
"fmt"
"sync"
)
var mu sync.Mutex
func main() {
numdone := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
data := []byte("ABCDEFGHIJ")
for i := 0; i < 10; i = i + 2 {
<-numdone
fmt.Printf("%c", data[i])
fmt.Printf("%c", data[i+1])
mu.Unlock()
}
}()
wg.Add(1)
go func() {
defer wg.Done()
for i := 1; i < 11; i = i + 2 {
mu.Lock()
fmt.Printf("%d", i)
fmt.Printf("%d", i+1)
numdone <- i
}
}()
wg.Wait()
}
Playground : https://play.golang.org/p/71Dv0iKTy_