golang工程師面試第二天
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。**1**.寫出代碼運行結果,如有錯誤則指出(1)```gopackage mainimport "fmt"func main() {/*先defer的後執行recover後輸出panic中的資訊 */defer func() {if err := recover(); err != nil {fmt.Print(err)} else {fmt.Print("no")}}()deferfunc() {panic("1111111111111")}()panic("22222222222")}```**解題思路**:先defer的語句後執行,即假如你defer了多個語句,執行時會按逆序執行,所以這段代碼執行順序為先 `panic("22222222222")`,再```godeferfunc() {panic("1111111111111")}()```最後``` godefer func() {if err := recover(); err != nil {fmt.Print(err)} else {fmt.Print("no")}}()```所以得出結果 輸出 1111111111111(2)```gopackage mainimport "fmt"var c1 =make(chan int)var c2 =make(chan int)func main() {go func() {fmt.Println("111111111111")c1<-<-c2}()go func() {c1<-<-c2fmt.Println("22222222222")}()<-c1}```**解題思路**:無緩衝的Channel發送接收都為阻塞,**2**.簡述go中的channel和mutex鎖機制的原理異同與使用情境golang中的同步是通過sync.WaitGroup來實現的.WaitGroup的功能:它實現了一個類似隊列的結構,可以一直向隊列中新增工作,當任務完成後便從隊列中刪除,如果隊列中的任務沒有完全完成,可以通過Wait()函數來出發阻塞,防止程式繼續進行,直到所有的隊列任務都完成為止.WaitGroup總共有三個方法:Add(delta int), Done(), Wait()。Add:添加或者減少等待goroutine的數量Done:相當於Add(-1)Wait:執行阻塞,直到所有的WaitGroup數量變成0**使用情境**: 程式中需要並發,需要建立多個goroutine,並且一定要等這些並發全部完成後才繼續接下來的程式執行.WaitGroup的特點是Wait()可以用來阻塞直到隊列中的所有任務都完成時才解除阻塞,而不需要sleep一個固定的時間來等待.但是其缺點是無法指定固定的goroutine數目.Channel機制:相對sync.WaitGroup而言,golang中利用channel實習同步則簡單的多.channel自身可以實現阻塞,其通過<-進行資料傳遞,channel是golang中一種內建基本類型,對於channel操作只有4種方式:建立channel(通過make()函數實現,包括無緩衝channel和有緩衝channel);向channel中添加資料(channel<-data);從channel中讀取資料(data<-channel);關閉channel(通過close()函數實現,關閉之後無法再向channel中存資料,但是可以繼續從channel中讀取資料)channel分為有緩衝channel和無緩衝channel,兩種channel的建立方法如下:var ch = make(chan int) //無緩衝channel,等同於make(chan int ,0)var ch = make(chan int,10) //有緩衝channel,緩衝大小是5其中無緩衝channel在讀和寫是都會阻塞,而有緩衝channel在向channel中存入資料沒有達到channel緩衝總數時,可以一直向裡面存,直到緩衝已滿才阻塞.由於阻塞的存在,所以使用channel時特別注意使用方法,防止死結的產生.**golang 並發總結**:並發兩種方式:sync.WaitGroup,該方法最大優點是Wait()可以阻塞到隊列中的所有任務都執行完才解除阻塞,但是它的缺點是不能夠指定並發協程數量.channel優點:能夠利用帶緩衝的channel指定並發協程goroutine,比較靈活.但是它的缺點是如果使用不當容易造成死結;並且他還需要自己判定並發goroutine是否執行完.但是相對而言,channel更加靈活,使用更加方便,同時通過逾時處理機制可以很好的避免channel造成的程式死結,因此利用channel實現程式並發,更加方便,更加易用.**3**.簡述go中實現非阻塞IO的原理,以及對goroutine的理解**4**.如何理解go中的閉包和逃逸分析```gofunc f(i int) func() int { return func() int { i++ return i }}```返回的函數就是閉包。**逃逸分析**:在編譯器最佳化理論中,逃逸分析是一種確定指標動態範圍的方法,可以分析在程式的哪些地方可以訪問到指標。它涉及到指標分析和形狀分析。 當一個變數(或對象)在子程式中被分配時,一個指向變數的指標可能逃逸到其它執行線程中,或者去調用子程式。如果使用尾遞迴最佳化(通常在函數程式設計語言中是需要的),對象也可能逃逸到被調用的子程式中。 如果一個子程式分配一個對象並返回一個該對象的指標,該對象可能在程式中的任何一個地方被訪問到——這樣指標就成功“逃逸”了。如果指標儲存在全域變數或者其它資料結構中,它們也可能發生逃逸,這種情況是當前程式中的指標逃逸。 逃逸分析需要確定指標所有可以儲存的地方,保證指標的生命週期只在當前進程或線程中。**逃逸分析的用處**:最大的好處應該是減少gc的壓力,不逃逸的對象分配在棧上,當函數返回時就回收了資源,不需要gc標記清除。因為逃逸分析完後可以確定哪些變數可以分配在棧上,棧的分配比堆快,效能好同步消除,如果你定義的對象的方法上有同步鎖,但在運行時,卻只有一個線程在訪問,此時逃逸分析後的機器碼,會去掉同步鎖運行。**5**.列出目前OS涉及到的幾種進程調度演算法,並簡述對他們的理解**6**.假如一個web伺服器存在大量的CLOSE_WAIT和LAST_ACK狀態的串連,你認為一般是那些原因造成的**7**.任意示範一段代碼,說明golang是如何?介面的,並能體現他相對oop中繼承方式的一些優勢658 次點擊