A1B2C3
使用兩個goroutine 一個印出 A-Z, 一個印出1-26
方法一
https://go.dev/play/p/-xtRmyfrede
package main
import (
"fmt"
"sync"
)
func main() {
abc := make(chan int)
num := make(chan int)
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
for i := 65; i <= 90; i++ {
fmt.Print(string(rune(i)))
abc <- i
<-num
}
}()
go func() {
defer wg.Done()
for i := 1; i <= 26; i++ {
<-abc
fmt.Print(i)
num <- i
}
}()
wg.Wait()
}
方法二: 緩衝
https://go.dev/play/p/iJ-gYxeqv31
package main
import (
"fmt"
"sync"
)
func main() {
abc := make(chan int, 1)
num := make(chan int, 1)
wg := sync.WaitGroup{}
wg.Add(2)
abc <- 0
go func() {
defer wg.Done()
for i := 65; i < 91; i++ {
<-abc
fmt.Printf("%s", string(rune(i)))
num <- i
}
}()
go func() {
defer wg.Done()
for i := 1; i < 27; i++ {
<-num
fmt.Printf("%d", i)
abc <- i
}
}()
wg.Wait()
}
方法三: mutex
https://go.dev/play/p/F830P2F_BiU
package main
import (
"fmt"
"sync"
)
func main() {
abcMux := sync.Mutex{}
numMux := sync.Mutex{}
wg := sync.WaitGroup{}
wg.Add(2)
numMux.Lock()
go func() {
defer wg.Done()
for i := 65; i < 91; i++ {
abcMux.Lock()
fmt.Printf("%s", string(rune(i)))
numMux.Unlock()
}
}()
go func() {
defer wg.Done()
for i := 1; i < 27; i++ {
numMux.Lock()
fmt.Printf("%d", i)
abcMux.Unlock()
}
}()
wg.Wait()
}