网络编程
位置:首页>> 网络编程>> Go语言>> go语言编程之select信道处理示例详解

go语言编程之select信道处理示例详解

作者:Jeff的技术栈  发布时间:2024-04-26 17:16:14 

标签:go语言,select,信道处理

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!")
}
}

来源:https://www.cnblogs.com/guyouyin123/p/13986339.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com