主要目的还是回顾一下并发编程的基础知识(毕竟学go的大部分应用场景都需要高并发),然后对例题进行了一些记录。
go中channel的应用场景
已经关闭的channel可以继续取值,但是不能再放值了。
#单向channel使用实例
*练习
使用俩个go routine交替打印序列,一个go routine 打印数字,另外一个打印字母 如下 12ab34cd....
package main
import (
"fmt"
"time"
)
var number, letter = make(chan bool), make(chan bool)
// 首先创建一个打印数字的go routine
func printNum() {
i := 1
for {
//难点是如何等待另一个goroutine通知
<-number
fmt.Printf("%d%d", i, i+1)
i += 2
letter <- true
}
}
func printLetter() {
i := 0
str := "abcdefghijklmnopqrstuvwxyz"
for {
//难点是如何等待另一个goroutine通知
<-letter
if i >= len(str) {
return
}
fmt.Printf(str[i : i+2])
i += 2
number <- true
}
}
func main() {
/*
使用俩个go routine交替打印序列,一个go routine 打印数字,另外一个打印字母
如下 12ab34cd....
*/
go printNum()
go printLetter()
number <- true
time.Sleep(time.Second * 100)
}
重点在于练习channel的创建以及<-值传递符号的使用
context使用
注意子ctx可以调用父ctx中的canel