var ch1, ch2, ch3 = make(chan struct{}), make(chan struct{}), make(chan struct{})
var wg sync.WaitGroup
wg.Add(3)
go func(s string) {
defer wg.Done()
for i := 1; i <= 10; i++ {
<-ch1
fmt.Print(s)
ch2 <- struct{}{}
}
<-ch1
}("A")
go func(s string) {
defer wg.Done()
for i := 1; i <= 10; i++ {
<-ch2
fmt.Print(s)
ch3 <- struct{}{}
}
}("B")
go func(s string) {
defer wg.Done()
for i := 1; i <= 10; i++ {
<-ch3
fmt.Println(s)
ch1 <- struct{}{}
}
}("C")
ch1 <- struct{}{}
wg.Wait()