Golang面试题目-使用两个goroutine交替打印数字和字母

题目:使⽤两个goroutine交替打印序列,⼀个goroutine打印数字, 另外⼀个goroutine打印字母,实现效果如下:

解答:题目要求用两个goroutine来交替打印数字和字母,核心问题是交替这两个字,涉及到两个进程之间的通信问题了,需用channel来控制打印的进度。

使用两个channel来分别控制打印数字的goroutine(A)和打印字母的goroutine(B)序列,A完成后通过channel通知B进行字母打印,B完成后通知A进行数字打印,然后周而复始运行。

因为用到了两个goroutine,所以需要使用一种同步方式,也就是Go中的WaitGroup,来保证这两个goroutine都能执行完毕。

上述解答中各名词含义如下:

  1. Go最大的特色是从语言层面支持并发(goroutine),它是Go中最基本的执行单元,也是Go提供的一种用户态线程,有时也称为协程。每一个Go程序至少有一个goroutine,在运行程序时,它会自行创建。

  2. channel是goroutine之间通信的一种方式,可类比成Unix的进程的通信方式管道。

  3. WaitGroup是Go中一种实现同步的方式,要注意的是WaitGroup变量定以后,是不允许被拷贝的,也就是说允许作为函数参数或赋值给其它变量。

案例如下:

package mainimport ("fmt""strings""sync")func main() {  letter, number := make(chan bool), make(chan bool)  wait := sync.WaitGroup{}  go func() {    i := 1    for {      select {      case <-number:        fmt.Println(i)        i++        fmt.Println(i)        i++        letter <- true        break      default:        break      }    }  }()  wait.Add(1)  go func(wait *sync.WaitGroup) {    str := "ABCDEFGHIJKLMN"    i := 0    for {      select {      case <-letter:        if i >= strings.Count(str, "")-1 {          wait.Done()          return        }        fmt.Println(str[i : i+1])        i++        if i >= strings.Count(str, "") {          i = 0        }        fmt.Println(str[i : i+1])        i++        number <- true        break      default:        break      }    }  }(&wait)  number <- true  wait.Wait()}

上述代码中用到两个channel进行通信,letter负责通知打印字母的goroutine进行字母打印,number用来通知打印数字的goroutine进行数字打印,wait则是等待字母打印完成后退出循环。

扫码关注公众号,获取更多优质内容。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值