004 Golang-channel-practice 左右括号匹配

第四题 左右括号打印

一个协程负责打印“(”,一个协程负责打印“)”,左右括号的数量要匹配。在这道题目里,我在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()
    }
}

来看看输出!

004 Golang-channel-practice 左右括号匹配_第1张图片

 

你可能感兴趣的:(Golang,golang,开发语言)