- go語言中的goroutine和其它語言中的coroutine有什麼相同和不一樣?
- coroutine 意味着支持將控制轉移到另外一個協程的明確手段。也就是說,程序員在肯定coroutine什麼時候應該暫停執行並將其控制權傳遞給另外一個coroutine時(經過調用return/exit(一般稱爲yield))來編寫coroutine。
- goroutine 它隱含的放棄了某些不肯定點的控制權,當goroutine即將在I / O完成,信道發送等某些(外部)資源上休眠時發生這種狀況。這種方法與經過channel共享狀態相結合程序員將程序邏輯編寫爲一組連續的輕量級進程,它消除了基於協程和基於事件的方法常見的意大利麪條代碼問題。
- goroutine和操做系統線
- 相同點,都是簡化了併發的操做。
- 不一樣點,簡單點來講:就是線程開銷太大了,因此搞一個協程,能夠在線程之間調度,具體的表現就是將一個函數的執行作成異步的,若是咱們用線程來作的話,開銷會很大,並且線程上下文的切換也很耗時間。下面翻譯原文給的解釋「Goroutines是將獨立執行的函數 - 協程 - 複用到一組線程上。當協程阻塞時,例如經過調用阻塞系統調用,運行時自動將同一操做系統線程上的其餘協同程序移動到另外一個可運行的線程,這樣它們就不會被阻塞。程序員看不到這一點,這就是重點。結果,咱們稱之爲goroutines,能夠很是便宜:它們在堆棧的內存以外幾乎沒有開銷,這只是幾千字節。爲了使堆棧變小,Go的運行時使用可調整大小的有限堆棧。一個新鑄造的goroutine給了幾千字節,這幾乎老是足夠的。若是不是,則運行時間會自動增加(並縮小)用於存儲堆棧的內存,從而容許許多goroutine生存在適量的內存中。 CPU開銷平均每一個函數調用大約三個廉價指令。在同一地址空間中建立數十萬個goroutine是切實可行的。若是goroutines只是線程,系統資源將以更小的數量運行。」
goroutine的默認調度器是怎麼調度的?如何實現本身的一個調度器?
- 這個是在go語言的runtime裏面實現的,須要瞭解一下go的runtime。參考文章:https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/
goroutine的生命週期是怎樣的過程?
- 若是在一個goroutine的函數中寫一個死循環,那麼go的main goroutine是能夠保證正常退出,若是main goroutine沒有循環,那麼子goroutine也不會有循環。這個方案應該是和goroutine的調度機制有關。
golang中垃圾回收機制是怎麼樣的?
goroutine中經常使用的數據結構?如何封裝本身的數據結構?
- 就像c語言中自定義結構體同樣,golang中一樣使用。
- 在服務器端編程,如何使用socket,何時使用應用層消息,如:http,何時使用傳輸層協議,如tcp。
- go語言編程中的select和c語言中使用select有什麼區別?
- 很相似,golang中select 能夠處理多個channel, 就像c語言中使用select處理多個socket通訊同樣。
- go語言中有沒有線程,有沒有進程?如何使用?
- 沒有像python中processing 和multiprocessing 之間的區別,go語言中只有一個goroutine,而且在這之上封裝了一個context來實現goroutine之間的通訊。
- go語言中channel,buffer怎麼理解,如何控制大小?
- 有channel,就有buffer,目的是爲了緩存大小,可是又不能太大,因此有這麼一個參數可讓咱們去控制。
- go語言內存模型
- 主要的是happern bofore,1:w happens before r, 2:Any other write to the shared variable
v
either happens before w or after r。而且提供了多個goroutine併發操做同步的手段。參考連接:https://golang.org/ref/mem
參考連接:go語言官網常見問題列表:https://golang.org/doc/faqpython