宁波网站公司哪里好,黄陂网站建设,影响网站速度的代码,广西壮族自治区教育厅使用两个goroutine交替打印数字与字母 题目如下#xff1a;
使用两个goroutine交替打印序列#xff0c;一个goroutine打印数字#xff0c;另外一个goroutine打印字母#xff0c;最终效果如下#xff1a; 12AB34CD56EF78GH910IZ1112KL1314MN1516OP1718QR1920ST2122UV2324W… 使用两个goroutine交替打印数字与字母 题目如下
使用两个goroutine交替打印序列一个goroutine打印数字另外一个goroutine打印字母最终效果如下 12AB34CD56EF78GH910IZ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 解题思路: 使⽤ channel 来控制打印的进度。使⽤两个 channel 来分别控制数字和 字⺟的打印序列 数字打印完成后通过 channel 通知字⺟打印, 字⺟打印完成后通知数字打印然后周⽽复始的⼯作
package mainimport (fmttime
)var number, letter make(chan bool), make(chan bool)func numberPrint() {i : 1for {-numberfmt.Printf(%d%d, i, i1)i 2letter - true}
}
func letterPrint() {i : 0str : ABCDEFGHIZKLMNOPQRSTUVWXYZfor {if i len(str) {return}-letterfmt.Print(str[i : i2])i 2number - true}
}
func main() {go numberPrint()go letterPrint()number - truetime.Sleep(5 * time.Second)
}
注意main routine中的number-true要写在两个go协程下面因为定义的channel是无缓冲通道所以当对这个缓冲通道写的时候会一直阻塞等到某个协程对这个缓冲通道读
如果写在两个go协程上面会发生阻塞报错 all goroutines are asleep - deadlock
关于无缓冲通道 一次只能传输一个数据 同一时刻同时有 读、写两端把持 channel 如果只有读端没有写端那么 “读端”阻塞 如果只有写端没有读端那么 “写端”阻塞
那么有缓冲通道即为一方可以写入很多数据不用等对方的操作而另外一方也可以直接拿出数据不需要等对方写但是注意一点如果写入的一方把channel写满了那么如果要继续写就要等对方取数据后才能继续写入这也是一种阻塞读出数据也是一样如果里面没有数据则不能取就要等对方写入