您好,登錄后才能下訂單哦!
本篇文章為大家展示了Channel 怎么在Golang中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
channel 是干什么的
意義:channel 是用來通信的
實際上:(數據拷貝了一份,并通過 channel 傳遞,本質就是個隊列)
channel 應該用在什么地方
核心:需要通信的地方
例如以下場景:
通知廣播
交換數據
顯式同步
并發控制
...
記住!channel 不是用來實現鎖機制的,雖然有些地方可以用它來實現類似讀寫鎖,保護臨界區的功能,但不要這么用!
channel 用例實現
超時控制
// 利用 time.After 實現 func main() { done := do() select { case <-done: // logic case <-time.After(3 * time.Second): // timeout } } func do() <-chan struct{} { done := make(chan struct{}) go func() { // do something // ... done <- struct{}{} }() return done }
取最快的結果
比較常見的一個場景是重試,第一個請求在指定超時時間內沒有返回結果,這時重試第二次,取兩次中最快返回的結果使用。
超時控制在上面有,下面代碼部分就簡單實現調用多次了。
func main() { ret := make(chan string, 3) for i := 0; i < cap(ret); i++ { go call(ret) } fmt.Println(<-ret) } func call(ret chan<- string) { // do something // ... ret <- "result" }
限制最大并發數
// 最大并發數為 2 limits := make(chan struct{}, 2) for i := 0; i < 10; i++ { go func() { // 緩沖區滿了就會阻塞在這 limits <- struct{}{} do() <-limits }() }
for...range 優先
for ... range c { do } 這種寫法相當于 if _, ok := <-c; ok { do }
func main() { c := make(chan int, 20) go func() { for i := 0; i < 10; i++ { c <- i } close(c) }() // 當 c 被關閉后,取完里面的元素就會跳出循環 for x := range c { fmt.Println(x) } }
多個 goroutine 同步響應
利用 close 廣播
func main() { c := make(chan struct{}) for i := 0; i < 5; i++ { go do(c) } close(c) } func do(c <-chan struct{}) { // 會阻塞直到收到 close <-c fmt.Println("hello") }
非阻塞的 select
select 本身是阻塞的,當所有分支都不滿足就會一直阻塞,如果想不阻塞,那么一個什么都不干的 default 分支是最好的選擇
select { case <-done: return default: }
for{select{}} 終止
盡量不要用 break label 形式,而是把終止循環的條件放到 for 條件里來實現
for ok { select { case ch <- 0: case <-done: ok = false } }
channel 特性
基礎特性
操作 | 值為 nil 的 channel | 被關閉的 channel | 正常的 channel |
---|---|---|---|
close | panic | panic | 成功關閉 |
c<- | 永遠阻塞 | panic | 阻塞或成功發送 |
<-c | 永遠阻塞 | 永遠不阻塞 | 阻塞或成功接收 |
happens-before 特性
無緩沖時,接收 happens-before 發送
任何情況下,發送 happens-before 接收
close happens-before 接收
上述內容就是Channel 怎么在Golang中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。