真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言面試經(jīng)典題目,go語言刷題

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

原文:【 】

站在用戶的角度思考問題,與客戶深入溝通,找到諸城網(wǎng)站設(shè)計與諸城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋諸城地區(qū)。

如果有解答的不對的,麻煩各位在評論寫出來~

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

go調(diào)用過程:

可以能,也可以不能。

因為go存在不能使用==判斷類型:map、slice,如果struct包含這些類型的字段,則不能比較。

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

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

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

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

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

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

應(yīng)用場景:

例子參考:

waitgroup

channel

len:切片的長度,訪問時間復(fù)雜度為O(1),go的slice底層是對數(shù)組的引用。

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

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

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

make([]Type,len,cap)

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

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

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

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

使用sync.Map來管理topic,用channel來做隊列。

參考:

多路歸并法:

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)首先讀取每個流的第一個數(shù),如果已經(jīng)EOF,pass;

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

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

/p/pre

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

第一步:

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

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

第二步:

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

第三步:

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

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

go文件讀寫參考:

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

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

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

參考:

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

get請求頁面信息,并返回實例的主體。

參考:

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

403: 拒絕訪問。

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

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

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

tcp的keep alive可通過

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

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

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

修改:

可以

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

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

udp使用場景:視頻通話、im聊天等。

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

time-wait作用:

解決辦法:

close_wait:

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

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

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

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

僵尸進(jìn)程:

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

孤兒進(jìn)程:

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

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

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

原文鏈接:

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

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

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

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

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

避免方法:

端口占用:lsof -i:端口號 或者 nestat

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

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

git log:查看提交記錄

git diff :查看變更記錄

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

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

git revert:反做指定版本,會新生成一個版本

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

etcd、Consul

pprof

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

explain

其他的見:

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

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

方法一:

方法二:

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

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

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

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

golang 100題中的問題但是只有答案,想知道為什么。

只把最終的函數(shù)放到defer棧中,因此

defer s.Add(1).Add(2) 等價于下面2句了

s..Add(1)

defer s.Add(2)

你可以試試

defer s.Add(2).Add(1).Add(4)

s.Add(3)

看看執(zhí)行的結(jié)果是不是 2134

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

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

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

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

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

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

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

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

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

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

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

10. goroutine之間的通信方式

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

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

大學(xué)英語口語topic經(jīng)典題目有哪些?

大學(xué)英語口語topic經(jīng)典題目:

一、飲食:Food and drink.

1、Do you have your breakfast at home?

2、Who cooks the meals in your family?

3、Do you often have something to drink when you have a big meal?

4、What is your favorite food?Why?

5、How many meals do you have every day?

二、學(xué)校生活:School life.

1、Do you live near your school?

2、How do you ususally go to school?

3、Do you have sports after school?

4、What do you think of your school?Why?

5、Do you think you are a good student?

三、天氣:Weather.

1、Do you like rainy days?

2、How many seasons are there in a year?

3、What’s your favorite season?Why?

4、Is it a fine day.

5、What’s the weather like here in spring?

四、周圍的環(huán)境:environments around.

1、Is there a park near your home?

2、How often do you go to the park?

3、Do you think your hometown is beautiful?

4、Who cleans your classroom every day?

5、How do you keep our environments clean?

五、個人情感:Emotions.

1、Are you happy today?

2、Do you like pop music?

3、Who is the most popular teacher in your school?

4、Will you get angry if your friend hit you?Why?

5、Do you love your teacher?

六、家庭、朋友與周圍的人:Family, friends and people around.

1、Are you the only child in your family?

2、Do you have any friends?

3、What do you usually do when you stay with your friends?

4、Are you happy when you stay with your family members?Why?

5、Do you love your family?

golang面試題2之判斷字符串中字符是否全都不同

請實現(xiàn) 個算法,確定 個字符串的所有字符【是否全都不同】。這 我們要求【不允

許使 額外的存儲結(jié)構(gòu)】。 給定 個string,請返回 個bool值,true代表所有字符全都

不同,false代表存在相同的字符。 保證字符串中的字符為【ASCII字符】。字符串的

度 于等于【3000】。

這 有 個重點,第 個是 ASCII字符 , ASCII字符 字符 共有256個,其中128個是常

字符,可以在鍵盤上輸 。128之后的是鍵盤上 法找到的。

然后是全部不同,也就是字符串中的字符沒有重復(fù)的,再次,不準(zhǔn)使 額外的儲存結(jié)

構(gòu),且字符串 于等于3000。

如果允許其他額外儲存結(jié)構(gòu),這個題 很好做。如果不允許的話,可以使 golang內(nèi)置

的 式實現(xiàn)。

通過 strings.Count 函數(shù)判斷:

使 的是golang內(nèi)置 法 strings.Count ,可以 來判斷在 個字符串中包含

的另外 個字符串的數(shù)量

還有不同的方法同樣可以實現(xiàn),你了解嗎?

推薦go相關(guān)技術(shù) 專欄

gRPC-go源碼剖析與實戰(zhàn)_帶你走進(jìn)gRPC-go的源碼世界-CSDN博客

利用go語言實現(xiàn)求數(shù)組交集的算法

題目: 給定兩個數(shù)組,編寫一個函數(shù)來計算它們的交集.(來自 leecode(349) )

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2] 示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4]

說明:

我的解法:

題目同上,只不過在輸出的時候

輸出結(jié)果中每個元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個數(shù)組中出現(xiàn)的次數(shù)一致。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2,2] 示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4]

解法

如果給定的數(shù)組是排好序的,

arr1 = [1,2,3,4,4,13],arr2 = [1,2,3,9,10]

那這個返回值該如何獲取得兩個數(shù)組的交集呢?

解法


新聞標(biāo)題:go語言面試經(jīng)典題目,go語言刷題
網(wǎng)頁路徑:http://weahome.cn/article/hopghc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部