相关信息
算法实现-golang实现交替打印数字字母
该题的关键在意通过channel进行控制
go
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
numberChan := make(chan struct{})
letterChan := make(chan struct{})
wg.Add(2)
// 打印数字
go func() {
defer wg.Done()
for i := 1; i <= 26; i++ {
<-numberChan
fmt.Print(i)
letterChan <- struct{}{}
}
}()
// 打印字母
go func() {
defer wg.Done()
for i := 'A'; i <= 'Z'; i++ {
<-letterChan
fmt.Print(string(i))
if i != 'Z' {
numberChan <- struct{}{}
}
}
}()
// 启动
numberChan <- struct{}{}
wg.Wait()
}
jspackage main
import (
"fmt"
"sync"
)
func main() {
nums := []int{5, 6, 2, 4, 1, 3}
// 分离奇偶数据
var odds, evens []int
for _, n := range nums {
if n%2 != 0 {
odds = append(odds, n)
} else {
evens = append(evens, n)
}
}
// oddTurn 控制奇数打印,evenTurn 控制偶数打印
// 初始时给 oddTurn 一个信号,让奇数协程先开始
oddTurn := make(chan struct{}, 1)
evenTurn := make(chan struct{})
var wg sync.WaitGroup
wg.Add(2)
oddTurn <- struct{}{} // 启动:先由奇数协程运行
// 奇数协程
go func() {
defer wg.Done()
for _, n := range odds {
<-oddTurn // 等待信号
fmt.Print(n)
evenTurn <- struct{}{} // 通知偶数协程
}
}()
// 偶数协程
go func() {
defer wg.Done()
for _, n := range evens {
<-evenTurn // 等待信号
fmt.Print(n)
oddTurn <- struct{}{} // 通知奇数协程
}
}()
wg.Wait()
fmt.Println() // 换行
}
本文作者:曹子昂
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!