Go語言自學筆記

2021-07-23 08:47:59 字數 1818 閱讀 3374

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

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

僅僅將channel變為有快取結果就變了,因為寫的執行緒有10個,而讀的執行緒只有乙個(主線程)。寫的速度比讀的快。當是無快取時,情況是讀完乙個寫乙個。有快取時,不必等讀,直接可以寫入快取,

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。輸出格式 共四行...