在講 channel 之前,有必要先提一下 csp 模型,傳統的併發模型主要分為 actor 模型和 csp 模型,csp 模型全稱為 communicating sequential processes,csp 模型由併發執行實體(程序,執行緒或協程),和訊息通道組成,實體之間通過訊息通道傳送訊息進行通訊。和 actor 模型不同,csp 模型關注的是訊息傳送的載體,即通道,而不是傳送訊息的執行實體。關於 csp 模型的更進一步的介紹,有興趣的同學可以閱讀** communicating sequential processes,go 語言的併發模型參考了 csp 理論,其中執行實體對應的是 goroutine, 訊息通道對應的就是 channel。 摘自:
1.channel支援go的兩種命名方式
var c chan int
c := make(chan int) //無快取channel 直接阻塞
c := make(chan int,3) //有快取channel,快取滿時,阻塞
2.channel可定義陣列
var channels [10]chan int
var channels [10]chan<- int send only
var channels [10] <-chan int receive only
3.channel可作為方法的入參
4.channel的關閉永遠由傳送方close
defer close(c)
5.channel的接收
n,ok := <- c ; if !ok break //自動檢測close,不如此做會在即使close後繼續獲取o值
for n : range c{} //會自動檢測close
package main
import (
"fmt"
"time"
)func main()
func work(id int, c chan int)
//或者用range接收,
/*for n: range c
*/fmt.printf("worker %d received %c\n", id, <-c) }}
//channel 也可以作為返回值
func createworker(id int) chan<- int
//channel可以作為引數,也可以建channel陣列
/*func worker(id int,c chan int)
}*/func chandemo()
//發資料
for i := 0; i < 10; i++
for i := 0; i < 10; i++
time.sleep(time.millisecond)
//直接收資料
//n := <- c
傳送的同時必須要有人收,併發收
}//有緩衝的channel,超過緩衝會報死鎖
func bufferedchannel()
主線程準備乙個接收變數同步,gorountine結束
package main
import(
"fmt"
)func main()
type worker struct
func chandemo()
//發資料
for i := 0; i < 10; i++
/*for i := 0; i < 10; i++
*/}//channel 也可以作為返回值
func createworker(id int) worker
go dowork(id, c.c,c.done)
return c
}func dowork(id int, c chan int,done chan bool )
}
《Go程式語言》 第6章
6.1 方法宣告 方法的宣告和普通函式的宣告類似,只是在函式名前多了乙個引數。這個引數把方法繫結到這個引數對應的型別上。import math type point struct 普通函式 func distance p,q point point型別的方法 p是方法的接收者,主調函式或方法,通過d...
C語言程式設計 第6章
參考例6.4程式,程式設計計算並輸出1到n之間的所有數的平方和立方。其中,n值由使用者從鍵盤輸入。include include intmain return0 某人在國外留學,不熟悉當地天氣預報中的華氏溫度值,請程式設計按每隔10 輸出0 到300 之間的華氏溫度到攝氏溫度的對照表,以方便他對照查...
《python語言程式設計基礎》 第6章
根據資料之間的關係,組合資料型別可以分為3類 序列型別 元素之間存在先後關係,通過序號訪問,元素之間可以是相通的 集合型別 元素無序,且相同元素在集合中唯一存在 對映型別 即鍵值對 這個庫的名字挺有趣!jieba是python中乙個重要的第三方中文分詞函式庫。jieba庫的分詞原理是利用乙個中文詞庫...