關於通道快取,為了方便理解我暫時可理解為通道的陣列,特性慢慢分析下
先學習通道的關閉
通道關閉,意味著不能在往通道發資料了.但是還可以接收資料.
package main
import
"fmt"
func
main()
else}}
()for j :=
1; j <=
3; j++
close
(jobs)
fmt.
println
("關閉通道"
)// <-done這裡是之前單通道的特性,用於等待協程完工,否則程式直接結束了
<-done
}/*列印的結果為
布置工作: 1
布置工作: 2
布置工作: 3
關閉通道
完成工作: 1
完成工作: 2
完成工作: 3
工作全部完成
為了更直觀的分析 關閉通道我們這麼來進行測試
package main
import
("fmt"
"time"
)func
main()
}() time.
sleep
(time.second*3)
for j :=
1; j <=
3; j++
close
(jobs)
fmt.
println
("完成工作並關閉通道,"
) time.
sleep
(time.second*20)
/*接收方協程開始工作:
布置工作: 1
布置工作: 2
布置工作: 3
完成工作並關閉通道,
完成工作: 1
接收方協程開始工作:
完成工作: 2
接收方協程開始工作:
完成工作: 3
接收方協程開始工作:
完成工作: 0
接收方協程開始工作:
完成工作: 0
...}
一旦關閉通道接收方沒處理的話會無限迴圈下去.
package main
import
("fmt"
"time"
)func
main()
fmt.
println
("完成了下一步")}
()queue <-
"one"
queue <-
"two"
//close(queue)
time.
sleep
(time.second*2)
queue <-
"111"
close
(queue)
time.
sleep
(time.second*10)
/*如果將close(queue) 注釋掉 那麼協程將會繼續阻塞到接受第四個值
}
這個例子如果使用 elem:=<- queue 來接受資料的話
那麼我們能輸入進通道的資料 就是快取數+ <- queue 的個數 否則就要報錯
range就相當於在接收方就相當於無限,傳送方可以無限傳送資料
Golang 關於通道 Chan 詳解
首先我們來看執行緒,在golang裡面也叫goroutine 下面我們先來看乙個例子吧 import fmt funcmain 在golang裡面,使用go這個關鍵字,後面再跟上乙個函式就可以建立乙個執行緒。後面的這個函式可以是已經寫好的函式,也可以是乙個匿名函式 funcmain i fmt.pr...
Golang 關於通道 Chan 詳解
首先我們來看執行緒,在golang裡面也叫goroutine 在讀這篇文章之前,我們需要了解一下併發與並行。golang的執行緒是一種併發機制,而不是並行。它們之間的區別大家可以上網搜一下,網上有很多的介紹。下面我們先來看乙個例子吧 import fmt funcmain 在golang裡面,使用g...
golang的chan有趣用法
寫這個部落格的背景是我面試一家公司,這家公司的cto給我出了一道我認為挺有意思的題,題的大概是這樣的 抽象乙個柵欄 type barrier inte ce 建立柵欄物件 func newbarrier n int barrier 柵欄的實現類 type barrier struct 測試 func...