說道通道:channel,不得不提go語言的併發程式設計模型:csp。
go語言提倡,通過通訊來共享記憶體。
goroutines:可以看做是go的乙個併發執行緒。基於系統執行緒。
每啟動乙個goroutine的堆初始化占用是2/4k,可以擴大到1g。這也是go語言可以啟動成千上萬個goroutine的原因。
啟動乙個goroutine只需要再函式呼叫前加乙個關鍵字go :go myfunc()
通道channel就是作為這些goroutine之間相互通訊、共享資料的渠道,準確的說就是通道。
channel是引用型別,多個名字指向乙個channel例項是,乙個關閉全部關閉。
channel分為雙向通道、唯讀通道、只寫信道。可以通過close()函式關閉通道。
關閉的通道只可以讀不可以寫(只寫的不可讀)。
channel帶緩衝區和不帶緩衝區的區別:
不帶緩衝區寫入乙個在寫入就會阻塞。帶緩衝區就是比不帶緩衝區的多寫帶的緩衝區大小個數的資料,再寫也會阻塞。
建立channel
var ch1 chan int
建立的ch1是nil值,讀取會阻塞,寫入會阻塞,close()會panic。除非特殊需求,不要這樣建立channel;
推薦使用make()建立channel。
//雙向channel
var ch1=
make
(chan
int)
//唯讀
var ch2=
make
(<-
chan
int)
//只寫
var ch3=
make
(chan
int<-
)
package main
import
("fmt"
)func
main()
close
(ch)
}(ch1)
for}
=>
這裡列印外0~9,會一直列印0,因為ch1被close了,<-ch1讀取到的返回值一直是0
這裡列印外0~9,會一直列印0,因為ch1被close了,<-ch1讀取到的返回值一直是0。
使用_,ok判斷channel是否關閉
上面的問題怎麼改正?使用ok布林值判斷是否關閉。
讀已關閉的channel會得到零值,如果不確定channel,需要使用ok進行檢測。ok的結果和含義:
true:讀到資料,並且通道沒有關閉。
false:通道關閉,無資料讀到。
for
else}=
>
res:
0res:
1res:
2res:
3res:
4res:
5res:
6res:
7res:
8res:
9正常退出。
使用for range讀channel
使用for range讀取channel,讀完也會退出。
場景:當需要不斷從channel讀取資料時。
使用for-range讀取channel,這樣既安全又便利,當channel關閉時,for迴圈會自動退出,無需主動監測channel是否關閉,可以防止讀取已經關閉的channel,造成讀到資料為通道所儲存的資料型別的零值。
for res:=
range ch1
select處理多個channel
select可以同時監控多個通道的情況,只處理未阻塞的case。當通道為nil時,對應的case永遠為阻塞,無論讀寫。特殊關注:普通情況下,對nil的通道寫操作是要panic的。
for
}
select中使用超時
for
}
唯讀只寫信道的作用
雙向通道可以隱身轉換為唯讀或者只寫信道。但是唯讀或者只寫信道不能轉換為雙向或別的通道。
唯讀通道可以在只需要讀寫的函式內使用,防止函式內部誤寫入。只寫也是如此。
package main
import
("fmt"
"time"
)func
main()
}(ch1)
gofunc
(ch <-
chan
int)
}(ch1)
time.
sleep(10
*time.second)}=》
res:
0res:
1res:
2res:
3res:
4res:
5res:
6res:
7res:
8res:
9
使用帶快取的channel控制併發
package main
import
("time"
"fmt"
)func
process
(ch chan
int)
func
main()
for i, ch :=
range channels
}
channel做同步,最簡單的生產者消費者
package main
// 帶緩衝區的channel
import
("fmt"
"time"
)func
produce
(ch chan
<-
int)
}func
consumer
(ch <-
chan
int)
}func
main()
12 Go語言基礎之map
go語言中提供的對映關係容器為map,其內部使用雜湊表 hash 實現。map是一種無序的基於key value的資料結構,go語言中的map是引用型別,必須初始化才能使用。map的定義語法如下 map keytype valuetype其中 map型別的變數預設初始值為nil,需要使用make 函...
1 2Go語言安裝
go語言編譯器及輔助工具可用於 windows macos 和linux 等作業系統。推薦盡可能使用作業系統自帶的包管理器來安裝go語言的 二進位制發行包 如 windows go1.11.4.windows amd64.msi maxos go1.11.4.darwin amd64.pkg lin...
12 Go語言 反射詳解
1.反射定義 可以在執行時動態獲取變數的相關資訊。import reflect 官方對此有個非常簡明的介紹,兩句話耐人尋味 反射提供一種讓程式檢查自身結構的能力。再精確點的描述是 反射是一種檢查inte ce變數的底層型別和值的機制 反射是困惑的源泉 想深入了解反射,必須深入理解型別和介面概念。2....