1、开启100个协程,顺序打印1-1000,并保证协程号为1的,打印尾数也是1
Go
package main
import "fmt"
const (
routineNum = 100
numMax = 1000
)
func main() {
s := make(chan struct{})
channels := make(map[int]chan int, 100)
for i := 1; i <= routineNum; i++ {
channels[i] = make(chan int)
}
for i := 1; i <= routineNum; i++ {
go func(idx int) {
for {
num := <-channels[idx]
fmt.Printf("chan id:[%d],num:[%d]\n", idx, num)
s <- struct{}{}
}
}(i)
}
for j := 1; j <= numMax; j++ {
idx := j % routineNum //0~99
if idx == 0 {
idx = routineNum
}
channels[idx] <- j
<-s
}
return
}
2、3个goroutinue交替打印abc10次
Go
package main
import (
"fmt"
"sync"
)
func main() {
chan1 := make(chan struct{})
chan2 := make(chan struct{})
chan3 := make(chan struct{})
var wg sync.WaitGroup
wg.Add(3)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
<-chan1
fmt.Println("a")
chan2 <- struct{}{}
}
<-chan1
}()
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
<-chan2
fmt.Println("b")
chan3 <- struct{}{}
}
}()
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
<-chan3
fmt.Println("c")
chan1 <- struct{}{}
}
}()
chan1 <- struct{}{}
wg.Wait()
close(chan1)
close(chan2)
close(chan3)
}
3、用不超过10个goroutinue打印不重复的打印slice中100个元素
4、用2个协程交替打印奇偶数