xfeng

xfeng

Sporting | Reading | Technology | Recording
github
bilibili

初識Golang

image

1. 什麼是 goroutine?如何停止它?#

  • 一個 Goroutine 是一個函數或方法執行同時旁邊其他任何夠程採用了特殊的
    Goroutine 線程。 Goroutine 線程比標準線程更輕量級,大多數 Golang 程序
    同時使用數千個 Goroutine。
  • 要創建 Goroutine,請 go 在函數聲明之前添加關鍵字。
  • 您可以通過向 Goroutine 發送一個信號通道來停止它。 Goroutines 只能在被
    告知檢查時響應信號,因此您需要在邏輯位置(例如 for 循環頂部)包含檢
    查。

2. 同步鎖有什麼特點?作用是什麼 ?#

  • Go 語言中,不要通過共享內存來通信,而要通過通信來實現內存共享。Go 的 CSP (Communicating Sequential Process) 並發模型,中文可以叫做通信順序進程,是通過 goroutine 和 channel 來實現的。
  • 當一個 Goroutine(協程)獲得了 Mutex 後,其他 Goroutine(協程)就只能乖乖的等待,除非該 Goroutine 釋放了該 Mutex。 RWMutex 在讀鎖佔用的情況下,會阻止寫,但不阻止讀 RWMutex。 在寫鎖佔用情況下,會阻止任何其他 Goroutine(無論讀和寫)進來,整個鎖相當於由該 Goroutine 獨佔同步鎖的作用是保證資源在使用時的獨有性,不會因為並發而導致數據錯亂,保證系統的穩定性。

3. Channel 有什麼特點,需要注意什麼?#

  • 如果給一個 nil 的 channel 發送數據,會造成永遠阻塞。
  • 如果從一個 nil 的 channel 中接收數據,也會造成永久阻塞。
  • 給一個已經關閉的 channel 發送數據, 會引起 panic。
  • 從一個已經關閉的 channel 接收數據, 如果緩衝區中為空,則返回一個零
    值。

4. GoConvey 是什麼?一般用來做什麼?#

  • go convey 是一個支持 Golang 的單元測試框架。
  • goconvey 能夠自動監控文件修改並啟動測試,並可以將測試結果實時輸出到 Web 界面。
  • go convey 提供了豐富的斷言簡化測試用例的編寫

5. Go 語言中 make 和 new 的區別?#

  • 二者都是用來做內存分配的。
  • make 只用於 slice、 map 以及 channel 的初始化, 返回的還是這三個引用類型本身。
  • 而 new 用於類型的內存分配, 並且內存對應的值為類型零值, 返回的是指向類型的指
    針。

6. Go 語言當中數組和切片的區別是什麼?#

  • 數組:
    • 數組固定長度。數組長度是數組類型的一部分,所以 [3] int 和 [4] int 是兩種不同的數組類型數組需要指定大小,不指定也會根據初始化,自動推算出大小,大小不可改變。數組是通過值傳遞的。
  • 切片:
    • 切片可以改變長度。切片是輕量級的數據結構,三個屬性,指針,長度,容量不需要指定大小切片是地址傳遞(引用傳遞)可以通過數組來初始化,也可以通過內置函數 make () 來初始化,初始化的時候 len=cap,然後進行擴容。

7. defer 的作用和特點是什麼?#

  • defer 的作用是:
    • 你只需要在調用普通函數或方法前加上關鍵字 defer,就完成了 defer 所需要的語法。當 defer 語句被執行時,跟在 defer 後面的函數會被延遲執行。直到包含該 defer 語句的函數執行完畢時,defer 後的函數才會被執行,不論包含 defer 語句的函數是通過 return 正常結束,還是由於 panic 導致的異常結束。你可以在一個函數中執行多條 defer 語句,它們的執行順序與聲明順序相反。
  • defer 的常用場景:
    • defer 語句經常被用於處理成對的操作,如打開、關閉、連接、斷開連接、加鎖、釋放鎖。
    • 通過 defer 機制,不論函數邏輯多複雜,都能保證在任何執行路徑下,資源被釋放。
    • 釋放資源的 defer 應該直接跟在請求資源的語句後。

8. WaitGroup 用法?#

一個 WaitGroup 對象可以等待一組協程結束。使用方法是:

  • main 協程通過調用 wg.Add (delta int) 設置 worker 協程的個數,然後創建 worker 協程;
  • worker 協程執行結束以後,都要調用 wg.Done ();
  • main 協程調用 wg.Wait () 且被 block,直到所有 worker 協程全部執行結束後返回。

9. WaitGroup 實現原理?#

  • WaitGroup 主要維護了 2 個計數器,一個是請求計數器 v,一個是等待計數器 w,二者組成一個 64bit 的值,請求計數器占高 32bit,等待計數器占低 32bit。
  • 每次 Add 執行,請求計數器 v 加 1,Done 方法執行,等待計數器減 1,v 為
    0 時通過信號量喚醒 Wait ()。

10. 什麼是 sync.Once?#

  • Once 可以用來執行且僅僅執行一次動作,常常用於單例對象的初始化場景。
  • Once 常常用來初始化單例資源,或者並發訪問只需初始化一次的共享資源,或者在測試的時候初始化一次測試資源。
  • sync.Once 只暴露了一個方法 Do,你可以多次調用 Do 方法,但是只有第一次調用 Do 方法時 f 參數才會執行,這裡的 f 是一個無參數無返回值的函數。

11. 什麼操作叫做原子操作?#

原子操作即是進行過程中不能被中斷的操作,針對某個值的原子操作在被進行的過程中,CPU 絕不會再去進行其他的針對該值的操作。為了實現這樣的嚴謹性,原子操作僅會由一個獨立的 CPU 指令代表和完成。原子操作是無鎖的,常常直接通過 CPU 指令直接實現。事實上,其它同步技術的實現常常依賴於原子操作。

12. 原子操作和鎖的區別?#

  • 原子操作由底層硬件支持,而鎖則由操作系統的調度器實現。鎖應當用來保護一段邏輯,對於一個變量更新的保護。
  • 原子操作通常執行上會更有效率,並且更能利用計算機多核的優勢,如果要更新的是一個複合對象,則應當使用 atomic.Value 封裝好的實現。

13. 什麼是微服務?#

微服務,又稱微服務架構,是一種架構風格,它將應用程序構建為以業務領域為模型的小型自治服務集合。

通俗地說,你必須看到蜜蜂如何通過對齊六角形蠟細胞來構建它們的蜂窩狀物。他們最初從使用各種材料的小部分開始,並繼續從中構建一個大型蜂箱。這些細胞形成圖案,產生堅固的結構,將蜂窩的特定部分固定在一起。
這裡,每個細胞獨立於另一個細胞,但它也與其他細胞相關。這意味著對一個細胞的損害不會損害其他細胞,因此,蜜蜂可以在不影響完整蜂箱的情況下重建這些細胞。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。