用來處理blocking call的方法(非同步個概念)
非同步處理的概念,遇到會block的function時,同時去處理其他的function
舉例來說,有一個陣列,裡面保存許多網址,想要用一個for loop去對每個網址發請求,然後印出結果
由於發請求需要等,所以若沒有做任何調整,就必須等前一個網址回應,才向下一個網址發請求 (這個function 就稱作 blocking call)
func main() {
links := []string{
"<http://google.com>",
"<http://facebook.com>"
}
for _, link := range links {
checkLink(link)
}
}
func checkLink (link string) {
_, err := http.Get(link)
// ...
}
但使用 go Routines 就可以實現同時發請求,各等各的
當我們執行一個go程式(compile→run)他會自動產生一個go routine
go routine 可以想像成:是一個執行code的引擎,他會一行一行執行我們的go code(但實際上不會是一行一行,因為此時的code已經compile過,變成machine code)
底下這個範例:程式run時會自動產生一個go routine (稱作main go routine )
這個 main go routine 會(很像在)逐行執行code,按下圖順序,執行到3時,由於3要發request,要等一下,此時main go routine不能做其他事情,只能等
如果想要做到非同步的概念,就要在需要等的function call前面使用go的關鍵字: go
fetchFunction(xxx)
→ go fetchFunction(xxx)