select信道处理
注意:有default就不会阻塞
package main
func main() {
var chan1 = make(chan int)
var chan2 = make(chan int)
select {
case <-chan1:
// 如果chan1成功读到数据,则进行该case处理语句
case chan2:
// 如果chan2成功读到数据,则进行该case处理语句
default:
// 如果上面都没有成功,则进行该case处理语句
}
}
fibonacci数列监听
//fibonacci 1 1 2 3 5 8
package main
import (
"fmt"
)
//ch只写,quit只读
func fibonacci(ch chan<- int, quit <-chan bool) {
x, y := 1, 1
for {
//监听channel数据的流动
select {
case ch <- x:
x, y = y, x+y
case flag := <-quit:
fmt.Println("flag = ", flag)
return
}
}
}
func main() {
ch := make(chan int) //数字通信
quit := make(chan bool) //程序是否结束
//消费者,从channel读取内容
//新建协程
go func() {
for i := 0; i < 8; i++ {
num := <-ch
fmt.Println(num)
}
//可以停止
quit <- true
}() //别忘了()
//生产者,产生数字,写入channel
fibonacci(ch, quit)
}
1
1
2
3
5
8
13
21
flag = true
select监听协程
func main() {
//创建一个有缓存的channel
ch := make(chan int, 0)
//len(ch)缓冲区剩余数据个数, cap(ch)缓冲区大小
//新建协程
go func() {
for i := 0; i < 10; i++ {
ch <- i //往chan写内容
}
}()
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
go func(ctx context.Context) {
ticker := time.NewTicker(1 * time.Second)
for _ = range ticker.C {
select {
case <-ctx.Done():
fmt.Println("child process interrupt...")
return
default:
fmt.Printf("send message: %d\n", <-ch)
}
}
}(ctx)
defer close(ch)
defer cancel()
select {
case <-ctx.Done():
time.Sleep(1 * time.Second)
fmt.Println("main process exit!")
}
}
以上就是go语言编程之select信道处理示例详解的详细内容,更多关于go语言select信道处理 的资料请关注编程网其它相关文章!