天天看點

golang面試題解析

考點:defer執行順序 

解答: defer 是後進先出。 

panic 需要等defer 結束後才會向上傳遞。出現panic恐慌時候,會先按照defer的後入先出的順序執行,最後才會執行panic。

考點:foreach 

解答:這樣的寫法初學者經常會遇到的,很危險!與Java的foreach一樣,都是使用副本的方式。是以m[stu.Name]=&stu實際上一緻指向同一個指針,最終該指針的值為周遊的最後一個struct的值拷貝。就像想修改切片元素的屬性:

也是不可行的。大家可以試試列印出來:

考點:go執行的随機性和閉包 

解答:誰也不知道執行後列印的順序是什麼樣的,是以隻能說是随機數字。但是<code>A:</code>均為輸出10,<code>B:</code>從0~9輸出(順序不定)。第一個go func中i是外部for的一個變量,位址不變化。周遊完成後,最終i=10。故go func執行時,i的值始終是10。

第二個go func中i是函數參數,與外部for中的i完全是兩個變量。尾部(i)将發生值拷貝,go func内部指向值拷貝位址。

考點:go的組合繼承 

解答:這是Golang的組合模式,可以實作OOP的繼承。被組合的類型People所包含的方法雖然更新成了外部類型Teacher這個組合類型的方法(一定要是匿名字段),但它們的方法(ShowA())調用時接受者并沒有發生變化。此時People類型并不知道自己會被什麼類型組合,當然也就無法調用方法時去使用未知的組合者Teacher類型的功能。

考點:select随機性 

解答: select會随機選擇一個可用通用做收發操作。是以代碼是有肯觸發異常,也有可能不會。單個chan如果無緩沖時,将會阻塞。但結合 select可以在多個chan間等待執行。有三點原則: 

 select 中隻要有一個case能return,則立刻執行。 *

當如果同一時間有多個case均能return則僞随機方式抽取任意一個執行。

 如果沒有一個case能return則可以執行”default”塊。

解答:這道題類似第1題需要注意到defer執行順序和值傳遞 index:1肯定是最後執行的,但是index:1的第三個參數是一個函數,是以最先被調用calc("10",1,2)==&gt;10,1,2,3 執行index:2時,與之前一樣,需要先調用calc("20",0,2)==&gt;20,0,2,2 執行到b=1時候開始調用,index:2==&gt;calc("2",0,2)==&gt;2,0,2,2 最後執行index:1==&gt;calc("1",1,3)==&gt;1,1,3,4

考點:make預設值和append 

解答: make初始化是由預設值的哦,此處預設值為0

大家試試改為:

考點:map線程安全 

解答:可能會出現<code>fatal error: concurrent map read and map write</code>. 修改一下看看效果

考點:chan緩存池 

解答:看到這道題,我也在猜想出題者的意圖在哪裡。 chan?sync.RWMutex?go?chan緩存池?疊代? 是以隻能再讀一次題目,就從疊代入手看看。既然是疊代就會要求set.s全部可以周遊一次。但是chan是為緩存的,那就代表這寫入一次就會阻塞。我們把代碼恢複為可以運作的方式,看看效果

考點:golang的方法集 

解答:編譯不通過!做錯了!?說明你對golang的方法集還有一些疑問。一句話:golang的方法集僅僅影響接口實作和方法表達式轉化,與通過執行個體或者指針調用方法無關。

考點:interface内部結構 

解答:很經典的題!這個考點是很多人忽略的interface内部結構。 go中的接口分為兩種一種是空的接口類似這樣:

另一種如題目:

他們的底層結構如下:

可以看出iface比eface 中間多了一層itab結構。 itab 存儲_type資訊和[]fun方法集,從上面的結構我們就可得出,因為data指向了nil 并不代表interface 是nil,是以傳回值并不為空,這裡的fun(方法集)定義了接口的接收規則,在編譯的過程中需要驗證是否實作接口結果:

本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1949904