第四题 左右括号打印
一个协程负责打印“(”,一个协程负责打印“)”,左右括号的数量要匹配。在这道题目里,我在main函数里进行了一个死循环。会产生一个随机数,随机数就是接下来要打印的左括号的数量。
例如:((((()))))、(())、()。这样是正确的。一个左括号要匹配一个右括号。数量要对上~
())、((())。一看就左右不平衡,这就是错的!
在这里,我们运用了“空结构体”,这个空结构体是用来“占位置”的。A协程打印了多少个左括号,A协程就要往channel传递多少个空结构体,B协程再根据channel中空结构体的数量,来打印右括号
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func producer(c chan struct{}, times int) {
defer close(c)
for i := 0; i < times; i++ {
fmt.Print("(")
c <- struct{}{}
}
}
func consumer(c chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
for range c {
fmt.Print(")")
}
}
func main() {
rand.Seed(time.Now().UnixNano())
for {
times := rand.Intn(10) + 1
c := make(chan struct{})
var wg sync.WaitGroup
go producer(c, times)
// 启动多个消费者 goroutine
for i := 0; i < times; i++ {
wg.Add(1)
go consumer(c, &wg)
}
wg.Wait()
}
}
来看看输出!