Learn Golang in Days - Day 16-Go併發
Learn Golang in Days - Day 16-Go併發
簡介
- go語言支援併發,只需要使用go關鍵字開啟goroutine即可。
- goroutine是輕量級現場,goroutine由執行時進行排程管理
package main import "fmt" import "time" func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") }
通道channel
<-
ch <- v //v 傳送到通道ch v := <- ch //從通道ch接收資料,並賦值給v
- 宣告通道
- 預設情況下,通道是不帶緩衝區的。
ch := make(chan int)
- 例子
package main import ( "fmt" ) // 求和 func sum(s []int, c chan int) { sum := 0 fmt.Printf("0***********\n") fmt.Println(s) for _, v := range s { fmt.Printf("%d\t",v) sum += v } c <- sum fmt.Printf("\n1***********\n") } func main() { // 初始化切片 s := []int{61,2123,123,55,66,7,7,8,88,9,990,4343,2342, 7, 3, 4, 5, 8} // 建立通道 c := make(chan int) //啟動兩個協程 go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) // 從通道中接收 x, y := <-c, <-c fmt.Println("\n---------------------") fmt.Println(x, y, x+y) }
遍歷通道與關閉通道
-
Go通過range關鍵字來遍歷讀取通道的資料,類似於陣列與切片
v, ok := <- ch
package main import "fmt" import "time" func main() { c := make(chan int, 10) go fibonacci(cap(c), c) //遍歷 for i := range c { fmt.Println(i) } } //斐波那契數列 func fibonacci(n int, c chan int) { x, y := 0, 1 for i := 0; i < n; i++ { fmt.Println(time.Now()) time.Sleep(3 * time.Second) // x 傳送給通道c c <- x x, y = y, x+y } close(c) }