10 筆記go語言 併發

2021-08-08 20:47:46 字數 2657 閱讀 3010

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的包。名稱以大寫字母起始的是可匯出的,可以在包的外部呼叫.在...