10.筆記go語言——併發
goroutine 是由 go 執行時環境管理的輕量級執行緒。
go f(x, y, z)
開啟乙個新的 goroutine 執行
f(x, y, z)
f , x , y 和 z 是當前 goroutine中定義的,但是在新的 goroutine 中執行 `f`。
goroutine 在相同的位址空間中執行,因此訪問共享記憶體必須進行同步。sync 提供了這種可能,不過在go 中並不經常用到,因為有其他的辦法。
package main
import (
"fmt"
"time" )
func say(s string) }
func main()
channel 是有型別的管道,可以用 channel 操作符 <- 對其傳送或者接收值。
ch <- v // 將 v 送入 channel ch。
v := <-ch // 從 ch 接收,並且賦值給 v。
(「箭頭」就是資料流的方向。)
和 map 與 slice 一樣,channel 使用前必須建立:
ch := make(chan int)
預設情況下,在另一端準備好之前,傳送和接收都會阻塞。這使得 goroutine 可以在沒有明確的鎖或競態變數的情況下進行同步。
package main
import "fmt"
func sum(a int, c chan int)
c<- sum //
將和送入c
} func main()
c :=make(chan int)
gosum(a[:len(a)/2], c)
gosum(a[len(a)/2:], c)
x, y:= <-c, <-c // 從c
中獲取
fmt.println(x,y, x+y) }
執行:-517 12
channel 可以是 _帶緩衝的_。為 make 提供第二個引數作為緩衝長度來初始化乙個緩衝 channel:
ch := make(chan int, 100)
向緩衝 channel 傳送資料的時候,只有在緩衝區滿的時候才會阻塞。當緩衝區清空的時候接受阻塞。
修改例子使得緩衝區被填滿,然後看看會發生什麼。
package main
import "fmt"
func main()
執行:傳送者可以 close 乙個 channel 來表示再沒有值會被傳送了。接收者可以通過賦值語句的第二引數來測試 channel 是否被關閉:當沒有值可以接收並且 channel 已經被關閉,那麼經過v, ok := <-ch
之後 ok 會被設定為 `false`。
迴圈 `for i := range c` 會不斷從 channel 接收值,直到它被關閉。
注意: 只有傳送者才能關閉 channel,而不是接收者。向乙個已經關閉的 channel 傳送資料會引起 panic。 還要注意: channel 與檔案不同;通常情況下無需關閉它們。只有在需要告訴接收者沒有更多的資料的時候才有必要進行關閉,例如中斷乙個 `range`。
package main
import (
"fmt" )
func fibonacci(n int, c chan int)
close(c) }
func main() }
執行:select 語句使得乙個 goroutine 在多個通訊操作上等待。
select 會阻塞,直到條件分支中的某個可以繼續執行,這時就會執行那個條件分支。當多個都準備好的時候,會隨機選擇乙個。
package main
import "fmt"
func fibonacci(c, quit chan int) }
}func main()
quit<- 0
}()fibonacci(c,quit) }
執行:quit
當 select 中的其他條件分支都沒有準備好的時候,`default` 分支會被執行。
為了非阻塞的傳送或者接收,可使用 default 分支:
select }
}執行:
tick.
tick.
tick.
tick.
boom!
go go
**。在標準庫上需要幫助的話,參考 包手冊。語言本身的幫助,閱讀 語言規範是件令人愉快的事情。
進一步探索 go 的併發模型,參閱 go
併發模型 (幻燈片) 以及 深入
go 併發模型 (幻燈片) 並且閱讀 使用通訊共享記憶體 的**之旅。
想要開始編寫 web 應用,參閱 乙個簡單的程式設計環境 (幻燈片) 並且閱讀 編寫
web
應用 的指南.
go 中的一等公民函式 展示了有趣的函式型別。
go blog 有著眾多的關於 go 的文章資訊。
mikespook
的部落格有大量中文的關於 go 的文章和翻譯。
開源電子書 go web
程式設計 和 go
入門指南 能夠幫助你更加深入的了解和學習 go 語言。
關於本專案(中文)的任何意見、建議,請在這裡提交 issues。
55 筆記go語言 go型別
很多人喜歡go語言的原因是簡單。go語言的型別也是設計的如此簡單。go語言預設定義了一些型別如boolean,numeric和string.這些預定義的型別用於構建其他複雜的型別,例如array,struct,pointer,slice,map,channel等。型別可以有乙個名字也可以沒有名字。命...
34 筆記go語言 內建函式
34.筆記go語言 內建函式 預定義了少數函式,這意味著無需引用任何包就可以使用它們。close 用於channel通訊。使用它來關閉channel.delete 用於在map中刪除例項。len和cap 可用於不同的型別,len用於返回字串 slice和陣列的長度。new 用於各種型別的記憶體分配。...
37 筆記go語言 包
37.筆記go語言 包 包是函式和資料的集合。用package保留字定義乙個包。檔名不需要與包名一致。包名的約定是使用小寫字元。go包可以由多個檔案組成,但是使用相同的package 這一行。讓我們在檔案even.go中定義乙個叫做even的包。名稱以大寫字母起始的是可匯出的,可以在包的外部呼叫.在...