Go之Channel詳解

channel取數據時未被賦值將被阻塞,可使用這一機制來完成事件的監聽函數

     wg := new(sync.WaitGroup)
	wg.Add(2)
	event := make(chan bool)
	//函數
	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			fmt.Println("觸發事件前", i)
		}
		event <- true //觸發事件
	}()
	go func() {
		<-event
		defer wg.Done()
		for i := 0; i < 5; i++ {
			fmt.Println("觸發事件後", i)
		}

	}()

	wg.Wait()

輸出:blog

觸發事件前 0
觸發事件前 1
觸發事件前 2
觸發事件前 3
觸發事件前 4
觸發事件後 0
觸發事件後 1
觸發事件後 2
觸發事件後 3
觸發事件後 4事件

 

在使用Channel時要注意it

若是chan的容量已滿,將會發生死鎖event

如:class

 

data:=make(chan int ,3)

exit:=make(chan bool)

data<-1

data<-2

data<-3

data<-4//運行到這裏將被阻塞,由於chan容量已滿

 

len返回chan中未被讀取的元素數量,cap返回緩衝區大小,close關閉當前chan變量

 

 

判斷chan是否關閉channel

for{

  if d,ok:=<-data;ok}{

    fmt.Println(d)
  }else{

    break
  }

}

  

 

單向chan:只負責接收,或者只負責發送數據

至關於分離了chan的發送和接收,將其變爲兩個便於控制的變量di

c := make(chan int, 3)
var send chan<- int = c // send-only
var recv <-chan int = c // receive-only
send <- 1
<-recv
相關文章
相關標籤/搜索