用來處理blocking call的方法(非同步個概念)

Go Routines

非同步處理的概念,遇到會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 就可以實現同時發請求,各等各的

Screen Shot 2022-02-09 at 11.39.54 PM.png

Screen Shot 2022-02-09 at 11.39.37 PM.png

當我們執行一個go程式(compile→run)他會自動產生一個go routine

go routine 可以想像成:是一個執行code的引擎,他會一行一行執行我們的go code(但實際上不會是一行一行,因為此時的code已經compile過,變成machine code)

Screen Shot 2022-02-09 at 7.53.20 PM.png

底下這個範例:程式run時會自動產生一個go routine (稱作main go routine )

這個 main go routine 會(很像在)逐行執行code,按下圖順序,執行到3時,由於3要發request,要等一下,此時main go routine不能做其他事情,只能等

Screen Shot 2022-02-09 at 11.48.58 PM.png

如果想要做到非同步的概念,就要在需要等的function call前面使用go的關鍵字: go

Screen%20Shot%202022-02-09%20at%2011.55.11%20PM.png