package main;import (
"fmt"
"runtime"
"sync"
)//goruntine奉行通過通訊來共享記憶體,而不是共享記憶體來通訊
//channel是goruntine溝通的橋梁,大都是阻塞同步的
//通過make建立,close關閉
//channel是引用型別
//使用for range來迭代操作channel
//可設定單向或雙向通道
//可設定快取大小,在未被填滿前不會發生阻塞
func main() ();
//這裡是阻塞的,等到匿名函式執行完成,給ch設定為true時
//這裡能讀取出資料時,就退出。
<-ch;
ch1 := make(chan bool);
go func() ();
//對chan進行迭代操作時,必須在某個地方關閉該chan,不然會發生死鎖
for v := range ch1
//有快取是非同步的
ch2 := make(chan bool, 1);
go func() ();
ch2 <- true;
//使用多核
runtime.gomaxprocs(runtime.numcpu());
ch3 := make(chan bool, 10);
for i := 0; i < 10; i++
//這裡讀取10次,跟上面go run()執行次數相同
//保證10次執行都執行完,才退出
for i:= 0; i < 10; i++
//這裡建立任務
wg := sync.waitgroup{};
wg.add(10);
for i := 0; i < 10; i++
//等待所有任務完成
wg.wait();
//有多個chan時,如何處理
ch4, ch5 := make(chan int), make(chan string);
//用於判斷是否關閉
ch6 := make(chan bool);
go func()
fmt.println(v);
case v, ok := <-ch5:
if !ok
fmt.println(v);
}} }();
ch4 <- 1;
ch4 <- 2;
ch5 <- "hello";
ch5 <- "world";
close(ch4);
close(ch5);
//迴圈讀取二次
for i := 0; i < 2; i++
}func run(ch chan bool, ix int)
fmt.println(ix, a);
//給chan傳遞true,說明該run執行結束
ch <- true;
}func run2(wg *sync.waitgroup, ix int)
fmt.println(ix, a);
//任務完成
wg.done();
}
在 Go 語言中,正確的使用併發
glyph lefkowitz最近寫了一篇 啟蒙文章 其中他詳細的說明了一些關於開發高併發軟體的挑戰,如果你開發軟體但是沒有閱讀這篇問題,那麼我建議你閱讀一篇。這是一篇非常好的文章,現代軟體工程應該擁有的豐富智慧型。從多個花絮中提取,但是如果我斗膽提出主要觀點的總結,其內容就是 搶占式多工和一般共享...
Go語言併發
協程 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現重寄存於執行緒中,因此,系統開銷極小,可以有效提高執行緒的任務併發性,從而避免多執行緒的缺點。使用協程的優點是程式設計簡單,結構清晰 缺點是需要語言的支援。協程最大優勢 輕量級 可以輕鬆建立上百萬個而不會導致系統資源衰竭...
go 語言中的繼承
go 語言中可以通過匿名field來實現繼承的效果,type t1 struct func t t1 log func t t1 print type t2 struct t2 t2 可以通過t2.log 直接訪問t1的method,就像物件導向的繼承之後一樣訪問,不過這裡要注意的傳遞到log的是t...