這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前段時間嘗試了一點 Google 的 Go 語言,感覺其很多特性還是不錯的。Go 語言旨在結合傳統編譯型的靜態語言和解釋型的動態語言的優點,在其中找到一個平衡。從而打造一個既快速(編譯執行),又方便編程的語言(動態語言往往文法簡單快捷)。同時,Go 語言還具備豐富的特性以支援並發編程,這在現在多核非常普及的情況下,是很重要和強大的一個功能。
Go 語言的並發特性主要有 goroutine, channel 等。
goroutine - 可以大致理解為一種輕量級的線程(或微線程),它是一種“分配在同一個地址空間內的,能夠並存執行的函數”。同時,它是輕量級的,不需要像分配線程那樣分配獨立的棧空間。所以理論上講,我們可以很容易的分配很多個 goroutine, 讓它們並發執行,而其開銷則比多線程程式要小得多,從而可以讓程式支援比較大的並發性。
channel - 顧名思義,就是通道。通道的目的是用來傳遞資料。在一個通道上我們可以執行資料的發送(Send)和接受(Receive)操作。對於非緩衝的 channel 而言,Receive 方法執行時,會判斷該通道上是否有值,如果沒有就會等待(阻塞),直到有一個值為止。同樣,在 channel 上有值,而尚未被一個 Receiver 接受的時候,Send 方法也會阻塞,直到 Channel 變空。這樣,通過一個簡單的機制就可以保證 Send 和 Receive 總是在不同的時間執行的,而且只有 Send 之後才能 Receive. 這樣就避免了常規的多線程編程中資料共用的問題。正如 Go 語言的文檔一句話所說:
Do not communicate by sharing memory; instead, share memory by communicating.
不要通過共用記憶體來溝通;而是通過溝通來共用記憶體。
在常規的多線程編程裡,我們總是定義好一些類變數,如果這些變數有可能被多個線程同時訪問,那麼就需要加鎖。這樣帶來了一定的編程複雜性,如果代碼寫的稍有bug,則會導致讀/寫到錯誤的值。
而通過 channel 來溝通,我們得到了一個更為清晰的溝通方式。兩個線程(或者 goroutine)要讀寫相同的資料,則建立一個通道,雙方通過對這個通道執行 Send / Receive 的操作來設值或取值即可,相對而言,比較不容易出錯。
<<GO語言簡介下>>
http://www.20ju.com/content/V227275.htm