久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

go語(yǔ)言面試137題,go語(yǔ)言筆試題

Go 語(yǔ)言 channel 的阻塞問(wèn)題

Hello,大家好,又見面了!上一遍我們將 channel 相關(guān)基礎(chǔ)以及使用場(chǎng)景。這一篇,還需要再次進(jìn)階理解channel 阻塞問(wèn)題。以下創(chuàng)建一個(gè)chan類型為int,cap 為3。

南木林網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,南木林網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為南木林上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的南木林做網(wǎng)站的公司定做!

channel 內(nèi)部其實(shí)是一個(gè)環(huán)形buf數(shù)據(jù)結(jié)構(gòu) ,是一種滑動(dòng)窗口機(jī)制,當(dāng)make完后,就分配在 Heap 上。

上面,向 chan 發(fā)送一條“hello”數(shù)據(jù):

如果 G1 發(fā)送數(shù)據(jù)超過(guò)指定cap時(shí),會(huì)出現(xiàn)什么情況?

看下面實(shí)例:

以上會(huì)出現(xiàn)什么,chan 緩沖區(qū)允許大小為1,如果再往chan仍數(shù)據(jù),滿了就會(huì)被阻塞,那么是如何實(shí)現(xiàn)阻塞的呢?當(dāng) chan 滿時(shí),會(huì)進(jìn)入 gopark,此時(shí) G1 進(jìn)入一個(gè) waiting 狀態(tài),然后會(huì)創(chuàng)建一個(gè) sudog 對(duì)象,其實(shí)就sendq隊(duì)列,把 200放進(jìn)去。等 buf 不滿的時(shí)候,再喚醒放入buf里面。

通過(guò)如下源碼,你會(huì)更加清晰:

上面,從 chan 獲取數(shù)據(jù):

Go 語(yǔ)言核心思想:“Do not communicate by sharing memory; instead, share memory by communicating.” 你可以看看這本書名叫:Effective Go

如果接收者,接收一個(gè)空對(duì)象,也會(huì)發(fā)生什么情況?

代碼示例 :

也會(huì)報(bào)錯(cuò)如下:

上面,從 chan 取出數(shù)據(jù),可是沒有數(shù)據(jù)了。此時(shí),它會(huì)把 接收者 G2 阻塞掉,也是和G1發(fā)送者一樣,也會(huì)執(zhí)行 gopark 將狀態(tài)改為 waiting,不一樣的點(diǎn)就是。

正常情況下,接收者G2作為取出數(shù)據(jù)是去 buf 讀取數(shù)據(jù)的,但現(xiàn)在,buf 為空了,此時(shí),接收者G2會(huì)將sudog導(dǎo)出來(lái),因?yàn)楝F(xiàn)在G2已經(jīng)被阻塞了嘛,會(huì)把G2給G,然后將 t := -ch 中變量 t 是在棧上的地址,放進(jìn)去 elem ,也就是說(shuō),只存它的地址指針在sudog里面。

最后, ch - 200 當(dāng)G1往 chan 添加200這個(gè)數(shù)據(jù),正常情況是將數(shù)據(jù)添加到buf里面,然后喚醒 G2 是吧,而現(xiàn)在是將 G1 的添加200數(shù)據(jù)直接干到剛才G2阻塞的t這里變量里面。

你會(huì)認(rèn)為,這樣真的可以嗎?想一想,G2 本來(lái)就是已經(jīng)阻塞了,然后我們直接這么干肯定沒有什么毛病,而且效率提高了,不需要再次放入buf再取出,這個(gè)過(guò)程也是需要時(shí)間。不然,不得往chan添加數(shù)據(jù)需要加鎖、拷貝、解鎖一序列操作,那肯定就慢了,我想Go語(yǔ)言是為了高效及內(nèi)存使用率的考慮這樣設(shè)計(jì)的。(注意,一般都是在runtime里面完成,不然會(huì)出現(xiàn)象安全問(wèn)題。)

總結(jié) :

chan 類型的特點(diǎn):chan 如果為空,receiver 接收數(shù)據(jù)的時(shí)候就會(huì)阻塞等待,直到 chan 被關(guān)閉或者有新的數(shù)據(jù)到來(lái)。有這種個(gè)機(jī)制,就可以實(shí)現(xiàn) wait/notify 的設(shè)計(jì)模式。

相關(guān)面試題:

go語(yǔ)言中數(shù)組使用的注意事項(xiàng)和細(xì)節(jié)

1、數(shù)組是多個(gè) 相同類型 的數(shù)據(jù)的組合,一個(gè)數(shù)組一旦聲明/定義了,其 長(zhǎng)度是固定的,不能動(dòng)態(tài)變化 。

2、var arr []int? ? 這時(shí)arr就是一個(gè)slice 切片 。

3、數(shù)組中的元素可以是任何數(shù)據(jù)類型,包括值類型和引用類型,但是 不能混用 。

4、數(shù)組創(chuàng)建后,如果沒有賦值,有默認(rèn)值如下:

? ? 數(shù)值類型數(shù)組:????默認(rèn)值為 0

? ? 字符串?dāng)?shù)組:? ? ? ?默認(rèn)值為 ""

? ? bool數(shù)組:? ? ? ? ? ?默認(rèn)值為 false

5、使用數(shù)組的步驟:

? ? (1)聲明數(shù)組并開辟空間

? ? (3)給數(shù)組各個(gè)元素賦值

? ? (3)使用數(shù)組

6、數(shù)組的下標(biāo)是從0開始的。

7、數(shù)組下標(biāo)必須在指定范圍內(nèi)使用,否則報(bào)panic:數(shù)組越界,比如var arr [5]int的有效下標(biāo)為0~4.

8、Go的數(shù)組屬于 值類型 ,在默認(rèn)情況下是 值傳遞 ,因此會(huì)進(jìn)行值拷貝。 數(shù)組間不會(huì)相互影響。

9、如想在其他函數(shù)中去修改原來(lái)的數(shù)組,可以使用 引用傳遞 (指針方式)。

10、長(zhǎng)度是數(shù)組類型的一部分,在傳遞函數(shù)參數(shù)時(shí),需要考慮數(shù)組的長(zhǎng)度,看以下案例:

題1:編譯錯(cuò)誤,因?yàn)椴荒馨裑3]int類型傳遞給[]int類型,前者是數(shù)組,后者是切片;

題2:編譯錯(cuò)誤,因?yàn)椴荒馨裑3]int類型傳遞給[4]int類型;

題3:編譯正確,因?yàn)閇3]int類型傳給[3]int類型合法。

面試問(wèn)題總結(jié)(一)Golang

使用go語(yǔ)言的好處: go語(yǔ)言的設(shè)計(jì)是務(wù)實(shí)的, go在針對(duì)并發(fā)上進(jìn)行了優(yōu)化, 并且支持大規(guī)模高并發(fā), 又由于單一的碼格式, 相比于其他語(yǔ)言更具有可讀性, 在垃圾回收上比java和Python更有效, 因?yàn)樗呛统绦蛲瑫r(shí)執(zhí)行的.

1. 進(jìn)程, 線程, 協(xié)程的區(qū)別, 協(xié)程的優(yōu)勢(shì)

2. 講一下GMP模型(重點(diǎn))

3. Go的GC, 混合寫屏障(重點(diǎn))

4. go的Slice和數(shù)組的區(qū)別, slice的擴(kuò)容原理(重點(diǎn))

5. 講一下channel,實(shí)現(xiàn)原理(重點(diǎn))

6. 講一下Go的Map的實(shí)現(xiàn)原理, 是否線程安全, 如何實(shí)現(xiàn)安全(重點(diǎn))

7. new 和 make 的區(qū)別

8. 說(shuō)一下內(nèi)存逃逸

9. 函數(shù)傳指針和傳值有什么區(qū)別

10. goroutine之間的通信方式

11. 測(cè)試是怎么做的(單元測(cè)試, 壓力測(cè)試)

12. 堆和棧的區(qū)別

go面試題整理(附帶部分自己的解答)

原文:【 】

如果有解答的不對(duì)的,麻煩各位在評(píng)論寫出來(lái)~

go的調(diào)度原理是基于GMP模型,G代表一個(gè)goroutine,不限制數(shù)量;M=machine,代表一個(gè)線程,最大1萬(wàn),所有G任務(wù)還是在M上執(zhí)行;P=processor代表一個(gè)處理器,每一個(gè)允許的M都會(huì)綁定一個(gè)G,默認(rèn)與邏輯CPU數(shù)量相等(通過(guò)runtime.GOMAXPROCS(runtime.NumCPU())設(shè)置)。

go調(diào)用過(guò)程:

可以能,也可以不能。

因?yàn)間o存在不能使用==判斷類型:map、slice,如果struct包含這些類型的字段,則不能比較。

這兩種類型也不能作為map的key。

類似棧操作,后進(jìn)先出。

因?yàn)間o的return是一個(gè)非原子性操作,比如語(yǔ)句 return i ,實(shí)際上分兩步進(jìn)行,即將i值存入棧中作為返回值,然后執(zhí)行跳轉(zhuǎn),而defer的執(zhí)行時(shí)機(jī)正是跳轉(zhuǎn)前,所以說(shuō)defer執(zhí)行時(shí)還是有機(jī)會(huì)操作返回值的。

select的case的表達(dá)式必須是一個(gè)channel類型,所有case都會(huì)被求值,求值順序自上而下,從左至右。如果多個(gè)case可以完成,則會(huì)隨機(jī)執(zhí)行一個(gè)case,如果有default分支,則執(zhí)行default分支語(yǔ)句。如果連default都沒有,則select語(yǔ)句會(huì)一直阻塞,直到至少有一個(gè)IO操作可以進(jìn)行。

break關(guān)鍵字可跳出select的執(zhí)行。

goroutine管理、信息傳遞。context的意思是上下文,在線程、協(xié)程中都有這個(gè)概念,它指的是程序單元的一個(gè)運(yùn)行狀態(tài)、現(xiàn)場(chǎng)、快照,包含。context在多個(gè)goroutine中是并發(fā)安全的。

應(yīng)用場(chǎng)景:

例子參考:

waitgroup

channel

len:切片的長(zhǎng)度,訪問(wèn)時(shí)間復(fù)雜度為O(1),go的slice底層是對(duì)數(shù)組的引用。

cap:切片的容量,擴(kuò)容是以這個(gè)值為標(biāo)準(zhǔn)。默認(rèn)擴(kuò)容是2倍,當(dāng)達(dá)到1024的長(zhǎng)度后,按1.25倍。

擴(kuò)容:每次擴(kuò)容slice底層都將先分配新的容量的內(nèi)存空間,再將老的數(shù)組拷貝到新的內(nèi)存空間,因?yàn)檫@個(gè)操作不是并發(fā)安全的。所以并發(fā)進(jìn)行append操作,讀到內(nèi)存中的老數(shù)組可能為同一個(gè),最終導(dǎo)致append的數(shù)據(jù)丟失。

共享:slice的底層是對(duì)數(shù)組的引用,因此如果兩個(gè)切片引用了同一個(gè)數(shù)組片段,就會(huì)形成共享底層數(shù)組。當(dāng)sliec發(fā)生內(nèi)存的重新分配(如擴(kuò)容)時(shí),會(huì)對(duì)共享進(jìn)行隔斷。詳細(xì)見下面例子:

make([]Type,len,cap)

map的底層是hash table(hmap類型),對(duì)key值進(jìn)行了hash,并將結(jié)果的低八位用于確定key/value存在于哪個(gè)bucket(bmap類型)。再將高八位與bucket的tophash進(jìn)行依次比較,確定是否存在。出現(xiàn)hash沖撞時(shí),會(huì)通過(guò)bucket的overflow指向另一個(gè)bucket,形成一個(gè)單向鏈表。每個(gè)bucket存儲(chǔ)8個(gè)鍵值對(duì)。

如果要實(shí)現(xiàn)map的順序讀取,需要使用一個(gè)slice來(lái)存儲(chǔ)map的key并按照順序進(jìn)行排序。

利用map,如果要求并發(fā)安全,就用sync.map

要注意下set中的delete函數(shù)需要使用 delete(map) 來(lái)實(shí)現(xiàn),但是這個(gè)并不會(huì)釋放內(nèi)存,除非value也是一個(gè)子map。當(dāng)進(jìn)行多次delete后,可以使用make來(lái)重建map。

使用sync.Map來(lái)管理topic,用channel來(lái)做隊(duì)列。

參考:

多路歸并法:

pre class="vditor-reset" placeholder="" contenteditable="true" spellcheck="false"p data-block="0"(1)假設(shè)有K路a href=""數(shù)據(jù)流/a,流內(nèi)部是有序的,且流間同為升序或降序;

/pp data-block="0"(2)首先讀取每個(gè)流的第一個(gè)數(shù),如果已經(jīng)EOF,pass;

/pp data-block="0"(3)將有效的k(k可能小于K)個(gè)數(shù)比較,選出最小的那路mink,輸出,讀取mink的下一個(gè);

/pp data-block="0"(4)直到所有K路都EOF。

/p/pre

假設(shè)文件又1個(gè)G,內(nèi)存只有256M,無(wú)法將1個(gè)G的文件全部讀到內(nèi)存進(jìn)行排序。

第一步:

可以分為10段讀取,每段讀取100M的數(shù)據(jù)并排序好寫入硬盤。

假設(shè)寫入后的文件為A,B,C...10

第二步:

將A,B,C...10的第一個(gè)字符拿出來(lái),對(duì)這10個(gè)字符進(jìn)行排序,并將結(jié)果寫入硬盤,同時(shí)記錄被寫入的字符的文件指針P。

第三步:

將剛剛排序好的9個(gè)字符再加上從指針P讀取到的P+1位數(shù)據(jù)進(jìn)行排序,并寫入硬盤。

重復(fù)二、三步驟。

go文件讀寫參考:

保證排序前兩個(gè)相等的數(shù)其在序列的前后位置順序和排序后它們兩個(gè)的前后位置順序相同的排序叫穩(wěn)定排序。

快速排序、希爾排序、堆排序、直接選擇排序不是穩(wěn)定的排序算法。

基數(shù)排序、冒泡排序、直接插入排序、折半插入排序、歸并排序是穩(wěn)定的排序算法。

參考:

head只請(qǐng)求頁(yè)面的首部。多用來(lái)判斷網(wǎng)頁(yè)是否被修改和超鏈接的有效性。

get請(qǐng)求頁(yè)面信息,并返回實(shí)例的主體。

參考:

401:未授權(quán)的訪問(wèn)。

403: 拒絕訪問(wèn)。

普通的http連接是客戶端連接上服務(wù)端,然后結(jié)束請(qǐng)求后,由客戶端或者服務(wù)端進(jìn)行http連接的關(guān)閉。下次再發(fā)送請(qǐng)求的時(shí)候,客戶端再發(fā)起一個(gè)連接,傳送數(shù)據(jù),關(guān)閉連接。這么個(gè)流程反復(fù)。但是一旦客戶端發(fā)送connection:keep-alive頭給服務(wù)端,且服務(wù)端也接受這個(gè)keep-alive的話,兩邊對(duì)上暗號(hào),這個(gè)連接就可以復(fù)用了,一個(gè)http處理完之后,另外一個(gè)http數(shù)據(jù)直接從這個(gè)連接走了。減少新建和斷開TCP連接的消耗。這個(gè)可以在Nginx設(shè)置,

這個(gè)keepalive_timout時(shí)間值意味著:一個(gè)http產(chǎn)生的tcp連接在傳送完最后一個(gè)響應(yīng)后,還需要hold住keepalive_timeout秒后,才開始關(guān)閉這個(gè)連接。

特別注意TCP層的keep alive和http不是一個(gè)意思。TCP的是指:tcp連接建立后,如果客戶端很長(zhǎng)一段時(shí)間不發(fā)送消息,當(dāng)連接很久沒有收到報(bào)文,tcp會(huì)主動(dòng)發(fā)送一個(gè)為空的報(bào)文(偵測(cè)包)給對(duì)方,如果對(duì)方收到了并且回復(fù)了,證明對(duì)方還在。如果對(duì)方?jīng)]有報(bào)文返回,重試多次之后則確認(rèn)連接丟失,斷開連接。

tcp的keep alive可通過(guò)

net.ipv4.tcp_keepalive_intvl = 75 // 當(dāng)探測(cè)沒有確認(rèn)時(shí),重新發(fā)送探測(cè)的頻度。缺省是75秒。

net.ipv4.tcp_keepalive_probes = 9 //在認(rèn)定連接失效之前,發(fā)送多少個(gè)TCP的keepalive探測(cè)包。缺省值是9。這個(gè)值乘以tcp_keepalive_intvl之后決定了,一個(gè)連接發(fā)送了keepalive之后可以有多少時(shí)間沒有回應(yīng)

net.ipv4.tcp_keepalive_time = 7200 //當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí)。一般設(shè)置為30分鐘1800

修改:

可以

tcp是面向連接的,upd是無(wú)連接狀態(tài)的。

udp相比tcp沒有建立連接的過(guò)程,所以更快,同時(shí)也更安全,不容易被攻擊。upd沒有阻塞控制,因此出現(xiàn)網(wǎng)絡(luò)阻塞不會(huì)使源主機(jī)的發(fā)送效率降低。upd支持一對(duì)多,多對(duì)多等,tcp是點(diǎn)對(duì)點(diǎn)傳輸。tcp首部開銷20字節(jié),udp8字節(jié)。

udp使用場(chǎng)景:視頻通話、im聊天等。

time-wait表示客戶端等待服務(wù)端返回關(guān)閉信息的狀態(tài),closed_wait表示服務(wù)端得知客戶端想要關(guān)閉連接,進(jìn)入半關(guān)閉狀態(tài)并返回一段TCP報(bào)文。

time-wait作用:

解決辦法:

close_wait:

被動(dòng)關(guān)閉,通常是由于客戶端忘記關(guān)閉tcp連接導(dǎo)致。

根據(jù)業(yè)務(wù)來(lái)啊~

重要指標(biāo)是cardinality(不重復(fù)數(shù)量),這個(gè)數(shù)量/總行數(shù)如果過(guò)?。ㄚ吔?)代表索引基本沒意義,比如sex性別這種。

另外查詢不要使用select *,根據(jù)select的條件+where條件做組合索引,盡量實(shí)現(xiàn)覆蓋索引,避免回表。

僵尸進(jìn)程:

即子進(jìn)程先于父進(jìn)程退出后,子進(jìn)程的PCB需要其父進(jìn)程釋放,但是父進(jìn)程并沒有釋放子進(jìn)程的PCB,這樣的子進(jìn)程就稱為僵尸進(jìn)程,僵尸進(jìn)程實(shí)際上是一個(gè)已經(jīng)死掉的進(jìn)程。

孤兒進(jìn)程:

一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。

子進(jìn)程死亡需要父進(jìn)程來(lái)處理,那么意味著正常的進(jìn)程應(yīng)該是子進(jìn)程先于父進(jìn)程死亡。當(dāng)父進(jìn)程先于子進(jìn)程死亡時(shí),子進(jìn)程死亡時(shí)沒父進(jìn)程處理,這個(gè)死亡的子進(jìn)程就是孤兒進(jìn)程。

但孤兒進(jìn)程與僵尸進(jìn)程不同的是,由于父進(jìn)程已經(jīng)死亡,系統(tǒng)會(huì)幫助父進(jìn)程回收處理孤兒進(jìn)程。所以孤兒進(jìn)程實(shí)際上是不占用資源的,因?yàn)樗K究是被系統(tǒng)回收了。不會(huì)像僵尸進(jìn)程那樣占用ID,損害運(yùn)行系統(tǒng)。

原文鏈接:

產(chǎn)生死鎖的四個(gè)必要條件:

(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。

(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。

(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。

(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

避免方法:

端口占用:lsof -i:端口號(hào) 或者 nestat

cpu、內(nèi)存占用:top

發(fā)送信號(hào):kill -l 列出所有信號(hào),然后用 kill [信號(hào)變化] [進(jìn)程號(hào)]來(lái)執(zhí)行。如kill -9 453。強(qiáng)制殺死453進(jìn)程

git log:查看提交記錄

git diff :查看變更記錄

git merge:目標(biāo)分支改變,而源分支保持原樣。優(yōu)點(diǎn):保留提交歷史,保留分支結(jié)構(gòu)。但會(huì)有大量的merge記錄

git rebase:將修改拼接到最新,復(fù)雜的記錄變得優(yōu)雅,單個(gè)操作變得(revert)很簡(jiǎn)單;缺點(diǎn):

git revert:反做指定版本,會(huì)新生成一個(gè)版本

git reset:重置到某個(gè)版本,中間版本全部丟失

etcd、Consul

pprof

節(jié)省空間(非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),相對(duì)b tree的優(yōu)勢(shì)),減少I/O次數(shù)(節(jié)省的空間全部存指針地址,讓樹變的矮胖),范圍查找方便(相對(duì)hash的優(yōu)勢(shì))。

explain

其他的見:

runtime2.go 中關(guān)于 p 的定義: 其中 runnext 指針決定了下一個(gè)要運(yùn)行的 g,根據(jù)英文的注釋大致意思是說(shuō):

所以當(dāng)設(shè)置 runtime.GOMAXPROCS(1) 時(shí),此時(shí)只有一個(gè) P,創(chuàng)建的 g 依次加入 P, 當(dāng)最后一個(gè)即 i==9 時(shí),加入的最后 一個(gè) g 將會(huì)繼承當(dāng)前主 goroutinue 的剩余時(shí)間片繼續(xù)執(zhí)行,所以會(huì)先輸出 9, 之后再依次執(zhí)行 P 隊(duì)列中其它的 g。

方法一:

方法二:

[圖片上傳失敗...(image-4ef445-1594976286098)]

方法1:to_days,返回給的日期從0開始算的天數(shù)。

方法2:data_add。向日期添加指定時(shí)間間隔

[圖片上傳失敗...(image-b67b10-1594976286098)]

分享題目:go語(yǔ)言面試137題,go語(yǔ)言筆試題
網(wǎng)頁(yè)地址:http://sd-ha.com/article10/phhhdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、小程序開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)ChatGPT、自適應(yīng)網(wǎng)站、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管