日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

go語言編程之select信道處理示例詳解_Golang

作者:Jeff的技術棧 ? 更新時間: 2022-06-13 編程語言

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

欄目分類
最近更新