社招面試經(jīng)歷
面試概況
崗位:golang 開(kāi)發(fā)
公司:*** (公司名字就匿了,避免看了題再去面試對(duì)其他小伙伴不公平)
途經(jīng):朋友內(nèi)推
方向:IoT(物聯(lián)網(wǎng))/區(qū)塊鏈
用時(shí) 2 個(gè)多小時(shí)(其中半個(gè)小時(shí)在答題)
結(jié)果:
?
雖然失敗了但是還是有很多值得參考的地方,我還是挺看好這個(gè)公司發(fā)展的方向的,希望對(duì)想到這個(gè)(類(lèi))公司面試的小伙伴有幫助
面試題目
共 10 題,答題時(shí)間 30min,其實(shí)這些題都很基礎(chǔ),答案我放題后面
不定項(xiàng)選擇題
具體選項(xiàng)不完全確定是這些,但是考察的大概就這些內(nèi)容
對(duì)于
func add(args ...int) int {}調(diào)用方式正確的選項(xiàng)有()
A. add(1, 2)
B. add(1, 3, 7)
C. add([] int{1, 2})
D. add([] int{1, 3, 7}...)變量的初始化,下面正確的使用方式是()
A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10golang 中的引用類(lèi)型包括()
A. string
B. map
C. channel
D. interface關(guān)于整型切片的初始化,下面正確的是()
A. s := make([] int)
B. s := make([] int, 0)
C. s := make([] int, 5, 10)
D. s := [] int{1, 2, 3, 4, 5}關(guān)于 channel,下面語(yǔ)法正確的是()
A. var ch chan int
B. ch := make(chan int)
C. <- ch
D. ch <-關(guān)于無(wú)緩沖和有緩沖的 channel,下面說(shuō)法正確的是()
A.無(wú)緩沖的 channel 是默認(rèn)的緩沖為 1 的 channel
B.無(wú)緩沖的 channel 和有緩沖的 channel 都是同步的
C.無(wú)緩沖的 channel 和有緩沖的 channel 都是非同步的
D.無(wú)緩沖的 channel 是同步的,而有緩沖的 channel 是非同步的
不定項(xiàng)選擇題答案?以下答案僅供參考,主程沒(méi)給我最終答案,上面部分問(wèn)題是我在網(wǎng)上搜索 golang 面試題后才回想起來(lái)的
只要好好準(zhǔn)備,這些題都簡(jiǎn)單,全是基礎(chǔ)
ABD
ABC
BCD
BCD
ABC
D
解答題
不管是選擇題還是解答題都做到過(guò)類(lèi)似的題型,所以多刷面試題和 leetcode 沒(méi)毛病
算法題給我出的都是 leetcode 里面的簡(jiǎn)單難度的,以至于我都覺(jué)得不算算法題了~
除了算法還考了點(diǎn)基礎(chǔ)概念
簡(jiǎn)要描述下變量逃逸
簡(jiǎn)要描述下 slice 在 append 時(shí)發(fā)生了什么
給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)目標(biāo)值 target,請(qǐng)你在該數(shù)組中找出和為目標(biāo)值的那兩個(gè)整數(shù),并返回他們的數(shù)組下標(biāo)。leetcode 鏈接
給定兩個(gè)數(shù)組,編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算它們的交集、以及差集(交集簡(jiǎn)單,重點(diǎn)在差集上)。leetcode 上只講了交集沒(méi)講差集
如輸入 nums1 = [4,9,5], nums2 = [7,5,10,8,4] 交集返回 [4,5] 差集返回 [9],[7,10,8]
變量逃逸這題我懵了,我沒(méi)看過(guò)這個(gè)的定義,所以就亂寫(xiě)了一堆
答:不知此題是否想考 golang 的垃圾回收機(jī)制,golang 的垃圾回收機(jī)制使用的是三色標(biāo)記法,即先標(biāo)記后刪除,具體邏輯可在面試時(shí)詳講(解釋起來(lái)有點(diǎn)長(zhǎng)太長(zhǎng),所以就寫(xiě)了的面試時(shí)在直接給面試官講...)?但是,實(shí)際情況是這樣的嗎??并不是!?。∠旅鏁?huì)有解釋
答:先看原來(lái)的 cap 夠不夠裝下需要添加進(jìn)去的元素,如果夠,則直接添加 如果不夠,則判斷現(xiàn)在 slice 的大小,大于 1024 則擴(kuò)容 1.25 倍,不夠再擴(kuò) 1.25 倍;如果小于 1024,則擴(kuò)容到原來(lái)的兩倍,同理,不夠再擴(kuò) 2 倍?emmmm,這道題感覺(jué)回答得沒(méi)啥問(wèn)題,畢竟面試前惡補(bǔ)過(guò)?下面為官方實(shí)際擴(kuò)容的規(guī)則代碼
func grow(s Value, extra int) (Value, int, int) {
i0 := s.Len()
i1 := i0 + extra
if i1 < i0 {
panic("reflect.Append: slice overflow")
}
m := s.Cap()
if i1 <= m {
return s.Slice(0, i1), i0, i1
}
if m == 0 {
m = extra
} else {
for m < i1 {
if i0 < 1024 {
m += m
} else {
m += m / 4
}
}
}
t := MakeSlice(s.Type(), i1, m)
Copy(t, s)
return t, i0, i1
}后面兩道題都是 leetcode 的題,我就不詳細(xì)解釋了
不過(guò)我會(huì)在下面的主程面試中講下我是怎么做的,以及怎么 ‘忽悠’ 面試官,讓他知道我能做出更好的解決方案的
做完題我感覺(jué)我有了,我在考慮要 15K?16K?18K?了
主程面試
由于是內(nèi)推(在此感謝 @ 劉水水同學(xué)的推薦),直接跳過(guò)了前面的步驟,做完題面主程了(好像也沒(méi)跳過(guò)啥~~,反正就是給了機(jī)會(huì))
面試題講解
主程先給我講了下多選題的第三題,我選反了...給說(shuō)了下引用類(lèi)型的概念,我還在第三題下面?zhèn)渥⒘讼?br style="box-sizing: border-box;outline-style: none;">抱歉,對(duì)于引用類(lèi)型的概念我不熟悉,根據(jù)題意我猜測(cè)答案要么是 A 要么是 BCD(即反過(guò)來(lái))
結(jié)果我還是選反了~不過(guò)面試官還是比較滿意的我覺(jué)得這里也很重要,不要不會(huì)就直接放棄了,總要給出自己的結(jié)論,并且解釋下為什么我這樣想備注里面我沒(méi)寫(xiě)我為什么這樣猜測(cè),不過(guò)面試是我給面試官解釋了下比如 chan 不能單獨(dú)作為類(lèi)型,只能是 chan int,chan string 等 map 和 interface 同樣的道理(我都想到這里了居然還能答反,我也是醉了)?簡(jiǎn)答題 1. 面試官給我解釋了下變量逃逸的概念:變量逃逸就是變量的作用域的改變
?
面試官說(shuō)到這里的時(shí)候,我接過(guò)來(lái)解釋到:就是變量從棧逃逸到堆上面去了嗎?
得到肯定的回答后,我繼續(xù)說(shuō)(為了表明其實(shí)我還是理解,只是專(zhuān)業(yè)名詞不熟悉而已,所以該接過(guò)來(lái)說(shuō)的,必須主動(dòng)接過(guò)來(lái)說(shuō)),從棧到堆后會(huì)影響運(yùn)行速度什么的~因?yàn)槎焉系淖兞啃枰?GC 來(lái)處理(順便就把我上面答的三色原理提了下,表明雖然我的答案有問(wèn)題,但是也不是毫無(wú)關(guān)聯(lián)的~~哈哈哈,機(jī)智如我,我覺(jué)得此處很重要,即使題沒(méi)答對(duì)至少要讓面試官知道我是知道些東西的)
Go 變量逃逸分析具體可以參考這篇博文算法題 1 我用的是兩次 for 循環(huán)遍歷,在面試官評(píng)價(jià)之前我就先解釋了下,一共半個(gè)小時(shí),外加手寫(xiě)代碼,沒(méi)辦法去考慮更優(yōu)解,然后就講了用 map 來(lái)解的更優(yōu)方案(假裝完美混過(guò)去)
實(shí)際上是:面試官問(wèn)我,你為什么第一眼沒(méi)想到用 map 呢?
emmmm 好的我錯(cuò)了(不過(guò)至少讓面試官知道我知道更好的解決方案),實(shí)際上兩次 for 的做法,在 leetcode 上都能得到雙 90 的得分了~?算法題 2,交集我的做法是把長(zhǎng) slice 放 map 里面,然后循環(huán)短的 slice 判定另外一個(gè)的 map 里面是否含有,若有,則把對(duì)應(yīng)項(xiàng) append 到結(jié)果集中(其實(shí)到這里我就反應(yīng)過(guò)來(lái)上一題該用 map 了,但是...答題卡位置有限加上時(shí)間限制...我就放棄了修改)
差集同樣的用 map 加上 slice 的循環(huán)找出結(jié)果,主程給我說(shuō),此處更好的解決方案是使用 map 自帶的 delete 方法,把交集刪除后,剩下的就是差集了,可以把你們的答案留在評(píng)論區(qū)。。。。
emmmm 的確更好哈,可惜我沒(méi)想到
ok 面試題就到這里了,接下來(lái)是考了些 go 的基礎(chǔ)
go 基礎(chǔ)的考核
我盡量回憶當(dāng)時(shí)主程問(wèn)了的問(wèn)題,不確定能回憶完 后面的問(wèn)答題稍微要比前面的題難一點(diǎn)點(diǎn),不過(guò)也沒(méi)啥太難的 下面只做列舉,讓同行知道下面試官關(guān)心哪些問(wèn)題
簡(jiǎn)單談下 defer 的應(yīng)用場(chǎng)景及注意事項(xiàng)(關(guān)閉文件網(wǎng)絡(luò)請(qǐng)求等,先進(jìn)后出)
簡(jiǎn)單談下 chan 的應(yīng)用場(chǎng)景及注意事項(xiàng)
簡(jiǎn)述進(jìn)程、線程、協(xié)程的含義及區(qū)別
往一個(gè)對(duì)象里寫(xiě)入 10w 條數(shù)據(jù),怎樣保證數(shù)據(jù)的準(zhǔn)確性(chan、mutex 之類(lèi)的胡扯就對(duì)了)
閉包的注意事項(xiàng)(這里變量的引用是個(gè)坑)
簡(jiǎn)單介紹下 interface 的應(yīng)用場(chǎng)景(我給扯出什么 2.0go 打算加入泛型什么的,實(shí)際上面試官想問(wèn)的是接口不是 interface{}這個(gè)數(shù)據(jù)類(lèi)型...,等面試官給我糾正了下思路然后,我又繼續(xù)講接口相關(guān)的東西...) ... ... ok golang 的基礎(chǔ)考核完了,我感覺(jué)我目前問(wèn)題不大基本能過(guò)面試這關(guān)了
繼續(xù)考慮我的 15K?16K?18K?了~~~
和公司業(yè)務(wù)相關(guān)的技術(shù)考核
emmmm,然后我就掛在了這里了
由于他們公司是做 IoT 的所以偏向底層
所以就考了我一些操作系統(tǒng)原理的問(wèn)題
作為一個(gè)非科班出生的人,我當(dāng)場(chǎng)懵逼
我知道接下來(lái)我將面臨的問(wèn)題是我無(wú)法正確解答的
不過(guò)抱著試一試的心態(tài)繼續(xù)淦?以下答案請(qǐng)勿參考,我是亂答的,你只需要看題就夠了
線上 cpu 和內(nèi)存突然飆高后應(yīng)該怎么排錯(cuò)(debug)
emmmm,linux 應(yīng)該有命令能直接查看哪個(gè)進(jìn)程導(dǎo)致的,然后.... 好吧我不知道
哪些操作會(huì)導(dǎo)致內(nèi)存泄漏
有大量的 io 的情況(我也不知道對(duì)不對(duì),后來(lái)去搜了下,好像是沒(méi) close 才會(huì)出現(xiàn))
哪些操作會(huì)導(dǎo)致 io 開(kāi)銷(xiāo)大幅上升
大量的文件讀寫(xiě)操作會(huì)導(dǎo)致 io 開(kāi)銷(xiāo)劇增,所以可以用 bufio 緩沖 還有呢?emmm 比如數(shù)據(jù)庫(kù)的大量讀寫(xiě) 還有呢?emmm 比如緩存的讀寫(xiě)... 還有呢?(好吧我錯(cuò)了)不知道了 網(wǎng)絡(luò)請(qǐng)求也會(huì)造成大量的 io,嚴(yán)格意義上來(lái)講數(shù)據(jù)庫(kù)的讀寫(xiě)也屬于網(wǎng)絡(luò)請(qǐng)求中的一種 emmmm (好的,我明白了,實(shí)際上第一次答的時(shí)候去掉'文件'這兩個(gè)字就好了)
...后面還問(wèn)了些比較涉及操作系統(tǒng)底層的東西,由于我不太能理解所以就記得不太清楚了
面試官結(jié)語(yǔ)
面:你 golang 的基礎(chǔ)不錯(cuò),語(yǔ)言上沒(méi)有什么問(wèn)題,但是我們公司做的 IoT 方向,除了語(yǔ)言本身,還要懂的操作系統(tǒng)原理才行,比如你的算法題,你就沒(méi)去考慮時(shí)間空間的問(wèn)題,如果你去一個(gè)偏向業(yè)務(wù)的崗位問(wèn)題不大,但是我們公司是偏向底層的,所以不太適合你 我:那貴公司是否有其他偏向業(yè)務(wù)開(kāi)發(fā)的部門(mén)呢?面:公司還有個(gè)部門(mén)是做區(qū)塊鏈的,更偏向底層 emmmmm
面試官走了 hrbp 來(lái)了(其實(shí)就已經(jīng)結(jié)束了)
如果我們公司有其他崗位適合你的,我們這邊會(huì)通知你的 (哦,理解了,大概意思就是你現(xiàn)在不適合我們公司,面試結(jié)束)
個(gè)人覺(jué)得重要的中間細(xì)節(jié)
簡(jiǎn)答題最好一開(kāi)始就寫(xiě)最好的方案
有的東西不知道沒(méi)關(guān)系,但是不回答那你肯定就沒(méi)戲了,胡扯也得扯,反正你跑遠(yuǎn)了,面試官會(huì)把你拉回來(lái)的(有的人覺(jué)得,懂就是懂,不懂就是不懂,不要在面試官面前胡扯,面試官都能看出來(lái)的,其實(shí)我不這樣認(rèn)為,胡扯即使說(shuō)錯(cuò)了至少能讓面試官看到我在其他哪個(gè)哪個(gè)方面也還是略懂的)
雖然打斷面試官的話是不禮貌的,但是你應(yīng)該酌情考慮在關(guān)鍵地方合適的 ‘打斷’ 面試官的發(fā)言,然后你接上往后說(shuō),讓面試官知道你是知道這個(gè)知識(shí)點(diǎn)的(這個(gè)地方一定要把握好度,沒(méi)把握好的話,你之前回答的再好你都無(wú)了)
明確你面試的公司的 ‘屬性’ 針對(duì)性的復(fù)習(xí)下(但凡我提前看過(guò)操作系統(tǒng)原理,我都不會(huì)掛得那么毫無(wú)懸念)
如果你有不錯(cuò)開(kāi)源項(xiàng)目(或者參與的開(kāi)源項(xiàng)目)一定要寫(xiě)在簡(jiǎn)歷里,如果不是我簡(jiǎn)歷?里面寫(xiě)了和開(kāi)源相關(guān)的東西,我可能連面試的機(jī)會(huì)都沒(méi)有,如果有合適的工作崗位,歡迎小伙伴們給推薦哦,我的簡(jiǎn)歷?在 github 上有一份~~
講道理
我已經(jīng)很滿意我面試的表現(xiàn)了
雖然掛了,但是我把我知道的都說(shuō)出來(lái)了(當(dāng)然 grpc,http2 那些沒(méi)考)
而且通過(guò)面試官對(duì)我的評(píng)價(jià)以及答題情況讓我對(duì)自己在 go 語(yǔ)言基礎(chǔ)操作上更有自信了
然后就是,一個(gè)人、一本書(shū)、一個(gè)月還你一個(gè)奇跡(操作系統(tǒng)原理從入門(mén)到放棄)
一年前的我:php 是世界上最好的語(yǔ)言
現(xiàn)在的我:go 是世界上最好的語(yǔ)言
最后
祝我自己今年能成功轉(zhuǎn)入 go 開(kāi)發(fā)者的行列中
最后的最后
祝 go 紅紅火火
