Golang高階之關於channel全面分析 三

2021-09-27 00:24:33 字數 1727 閱讀 2583

關於通道快取,為了方便理解我暫時可理解為通道的陣列,特性慢慢分析下

先學習通道的關閉

通道關閉,意味著不能在往通道發資料了.但是還可以接收資料.

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...