**問題描述**
使用兩個`goroutine`交替打印序列,一個`goroutine`打印數字, 另外一個`goroutine`打印字母, 最終效果如下:
~~~shell
12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728
~~~
**解題思路**
問題很簡單,使用 channel 來控制打印的進度。使用兩個 channel ,來分別控制數字和字母的打印序列, 數字打印完成后通過 channel 通知字母打印, 字母打印完成后通知數字打印,然后周而復始的工作。
**源碼參考**
~~~
letter,number := make(chan bool),make(chan bool)
wait := sync.WaitGroup{}
go func() {
i := 1
for {
select {
case <-number:
fmt.Print(i)
i++
fmt.Print(i)
i++
letter <- true
break
default:
break
}
}
}()
wait.Add(1)
go func(wait *sync.WaitGroup) {
str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
i := 0
for{
select {
case <-letter:
if i >= strings.Count(str,"")-1 {
wait.Done()
return
}
fmt.Print(str[i:i+1])
i++
if i >= strings.Count(str,"") {
i = 0
}
fmt.Print(str[i:i+1])
i++
number <- true
break
default:
break
}
}
}(&wait)
number<-true
wait.Wait()
~~~
**源碼解析**
這里用到了兩個`channel`負責通知,letter 負責通知打印字母的 goroutine 來打印字母,number 用來通知打印數字的 goroutine 打印數字。
wait 用來等待字母打印完成后退出循環。
- Golnag常見面試題目解析
- 交替打印數組和字母
- 判斷字符串中字符是否全都不同
- 翻轉字符串
- 判斷兩個給定的字符串排序后是否一致
- 字符串替換問題
- 機器人坐標計算
- 語法題目一
- 語法題目二
- goroutine和channel使用一
- 實現阻塞讀的并發安全Map
- 定時與 panic 恢復
- 高并發下的鎖與map讀寫問題
- 為 sync.WaitGroup 中Wait函數支持 WaitTimeout 功能.
- 七道語法找錯題目
- golang 并發題目測試
- 記一道字節跳動的算法面試題
- 多協程查詢切片問題
- 對已經關閉的的chan進行讀寫,會怎么樣?為什么?
- 簡單聊聊內存逃逸?
- 字符串轉成byte數組,會發生內存拷貝嗎?
- http包的內存泄漏