package main
import (
"fmt"
)func main()
func f1(ch chan
int)
如果容量大於 0,通道就是非同步的了:緩衝滿載(傳送)或變空(接收)之前通訊不會阻塞,元素會按照傳送的順序被接收。如果容量是0或者未設定,通訊僅在收發雙方準備好的情況下才可以成功。
要在首要位置使用無緩衝通道來設計演算法,只在不確定的情況下使用緩衝。
package main
import (
"fmt"
)func main() //10個元素
ch := make(chan
int)
for index, v := range data (index, v)
}for i :=0; i < n; i++
}
輸出結果為
index is 0,value is 34解釋:34 23
45 23
5 2
1 456
76 46
程式線性執行到第乙個for迴圈時,for迴圈內的goroutine開始併發執行(即重開協程執行),10次迴圈結束後,開啟了10個併發的協程(比執行緒更輕量的概念),而主程式相當於跑了10次空迴圈。
一方面,主線程執行下乙個for迴圈,一方面那10個協程併發執行。
主線程當遇到第乙個fmt.println(<-ch)
時,檢視channel中是否有值,若有值則讀取並輸出,無值則等待阻塞。
goroutine的協程執行內嵌函式,ch <- v
向channel中傳值,若無線程接受則會阻塞。由於主線程的第二個for有接收值,當主線程接收完值後程式退出。由結果可見協程中的輸出語句只列印了一條(0-n,隨機),因為主程式接收完n個channel值就會退出,而列印語句在協程中處於傳值後。
然後我們看下乙個例子,只是在channel建立時指定了大小,channel就成了有快取的channel。
package main
import (
"fmt"
)func main()
ch := make(chan
int, n)
for index, v := range data (index, v)
}for i :=0; i < n; i++
}
輸出結果:
index is 0,value is 34僅僅將channel變為有快取結果就變了,因為寫的執行緒有10個,而讀的執行緒只有乙個(主線程)。寫的速度比讀的快。當是無快取時,情況是讀完乙個寫乙個。有快取時,不必等讀,直接可以寫入快取,index is 1,value is 23
index is 2,value is 45
index is 3,value is 23
index is 4,value is 5
index is 5,value is 2
index is 6,value is 1
index is 7,value is 456
index is 8,value is 76
index is 9,value is 46
34 23
45 23
5 2
1 456
76 46
C 語 言 自 學 筆記
hello world include intmain 程式框架 學習函式之前都要用到 include intmain 變數int a int a,b int a b 將b的值賦予a,與 b a 不同。int a 0 int b 0 int a 0,b 0 常量const int amount 10...
五 go語言特性 go語言筆記
defer 呼叫乙個被 defer 的函式時在函式剛要返回之前延遲執行,當函式無論怎樣返回,某資源必須釋放時,可用這種與眾不同 但有效的處理方式。傳統的例子包括解鎖互斥或關閉檔案。package main import log func main mydefer func mydefer func ...
自學C語言筆記一
這是中國大學mooc浙江大學 程式設計入門 c語言 的練習題目集的第i階段,包含變數 語句 迴圈部分的題目,不包括陣列 結構 基礎演算法的題目。1.對於輸入的兩個整數,按照要求輸出其和差積商。輸入格式 在一行內輸入兩個不超過100的非負整數a和b,中間以乙個空格間隔,且保證b不為0。輸出格式 共四行...