1. 程式人生 > >go語言常見問題總結

go語言常見問題總結

  • go語言中的goroutine和其它語言中的coroutine有什麼相同和不同?
    1. coroutine 意味著支援將控制轉移到另一個協程的明確手段。也就是說,程式設計師在確定coroutine何時應該暫停執行並將其控制權傳遞給另一個coroutine時(通過呼叫return/exit(通常稱為yield))來編寫coroutine。
    2. goroutine 它隱含的放棄了某些不確定點的控制權,當goroutine即將在I / O完成,通道傳送等某些(外部)資源上休眠時發生這種情況。這種方法與通過channel共享狀態相結合程式設計師將程式邏輯編寫為一組連續的輕量級程序,它消除了基於協程和基於事件的方法常見的義大利麵條程式碼問題。
  • goroutine和作業系統線
    1. 相同點,都是簡化了併發的操作。
    2. 不同點,簡單點來說:就是執行緒開銷太大了,所以搞一個協程,可以線上程之間排程,具體的表現就是將一個函式的執行做成非同步的,如果我們用執行緒來做的話,開銷會很大,而且執行緒上下文的切換也很耗時間。下面翻譯原文給的解釋“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/faq