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

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

go語言面試視頻講解,go語言面試100題

【golang詳解】go語言GMP(GPM)原理和調(diào)度

Goroutine調(diào)度是一個(gè)很復(fù)雜的機(jī)制,下面嘗試用簡單的語言描述一下Goroutine調(diào)度機(jī)制,想要對其有更深入的了解可以去研讀一下源碼。

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、做網(wǎng)站與策劃設(shè)計(jì),順河網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:順河等地區(qū)。順河做網(wǎng)站價(jià)格咨詢:028-86922220

首先介紹一下GMP什么意思:

G ----------- goroutine: 即Go協(xié)程,每個(gè)go關(guān)鍵字都會創(chuàng)建一個(gè)協(xié)程。

M ---------- thread內(nèi)核級線程,所有的G都要放在M上才能運(yùn)行。

P ----------- processor處理器,調(diào)度G到M上,其維護(hù)了一個(gè)隊(duì)列,存儲了所有需要它來調(diào)度的G。

Goroutine 調(diào)度器P和 OS 調(diào)度器是通過 M 結(jié)合起來的,每個(gè) M 都代表了 1 個(gè)內(nèi)核線程,OS 調(diào)度器負(fù)責(zé)把內(nèi)核線程分配到 CPU 的核上執(zhí)行

模型圖:

避免頻繁的創(chuàng)建、銷毀線程,而是對線程的復(fù)用。

1)work stealing機(jī)制

當(dāng)本線程無可運(yùn)行的G時(shí),嘗試從其他線程綁定的P偷取G,而不是銷毀線程。

2)hand off機(jī)制

當(dāng)本線程M0因?yàn)镚0進(jìn)行系統(tǒng)調(diào)用阻塞時(shí),線程釋放綁定的P,把P轉(zhuǎn)移給其他空閑的線程執(zhí)行。進(jìn)而某個(gè)空閑的M1獲取P,繼續(xù)執(zhí)行P隊(duì)列中剩下的G。而M0由于陷入系統(tǒng)調(diào)用而進(jìn)被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來源有可能是M的緩存池,也可能是新建的。當(dāng)G0系統(tǒng)調(diào)用結(jié)束后,根據(jù)M0是否能獲取到P,將會將G0做不同的處理:

如果有空閑的P,則獲取一個(gè)P,繼續(xù)執(zhí)行G0。

如果沒有空閑的P,則將G0放入全局隊(duì)列,等待被其他的P調(diào)度。然后M0將進(jìn)入緩存池睡眠。

如下圖

GOMAXPROCS設(shè)置P的數(shù)量,最多有GOMAXPROCS個(gè)線程分布在多個(gè)CPU上同時(shí)運(yùn)行

在Go中一個(gè)goroutine最多占用CPU 10ms,防止其他goroutine被餓死。

具體可以去看另一篇文章

【Golang詳解】go語言調(diào)度機(jī)制 搶占式調(diào)度

當(dāng)創(chuàng)建一個(gè)新的G之后優(yōu)先加入本地隊(duì)列,如果本地隊(duì)列滿了,會將本地隊(duì)列的G移動到全局隊(duì)列里面,當(dāng)M執(zhí)行work stealing從其他P偷不到G時(shí),它可以從全局G隊(duì)列獲取G。

協(xié)程經(jīng)歷過程

我們創(chuàng)建一個(gè)協(xié)程 go func()經(jīng)歷過程如下圖:

說明:

這里有兩個(gè)存儲G的隊(duì)列,一個(gè)是局部調(diào)度器P的本地隊(duì)列、一個(gè)是全局G隊(duì)列。新創(chuàng)建的G會先保存在P的本地隊(duì)列中,如果P的本地隊(duì)列已經(jīng)滿了就會保存在全局的隊(duì)列中;處理器本地隊(duì)列是一個(gè)使用數(shù)組構(gòu)成的環(huán)形鏈表,它最多可以存儲 256 個(gè)待執(zhí)行任務(wù)。

G只能運(yùn)行在M中,一個(gè)M必須持有一個(gè)P,M與P是1:1的關(guān)系。M會從P的本地隊(duì)列彈出一個(gè)可執(zhí)行狀態(tài)的G來執(zhí)行,如果P的本地隊(duì)列為空,就會想其他的MP組合偷取一個(gè)可執(zhí)行的G來執(zhí)行;

一個(gè)M調(diào)度G執(zhí)行的過程是一個(gè)循環(huán)機(jī)制;會一直從本地隊(duì)列或全局隊(duì)列中獲取G

上面說到P的個(gè)數(shù)默認(rèn)等于CPU核數(shù),每個(gè)M必須持有一個(gè)P才可以執(zhí)行G,一般情況下M的個(gè)數(shù)會略大于P的個(gè)數(shù),這多出來的M將會在G產(chǎn)生系統(tǒng)調(diào)用時(shí)發(fā)揮作用。類似線程池,Go也提供一個(gè)M的池子,需要時(shí)從池子中獲取,用完放回池子,不夠用時(shí)就再創(chuàng)建一個(gè)。

work-stealing調(diào)度算法:當(dāng)M執(zhí)行完了當(dāng)前P的本地隊(duì)列隊(duì)列里的所有G后,P也不會就這么在那躺尸啥都不干,它會先嘗試從全局隊(duì)列隊(duì)列尋找G來執(zhí)行,如果全局隊(duì)列為空,它會隨機(jī)挑選另外一個(gè)P,從它的隊(duì)列里中拿走一半的G到自己的隊(duì)列中執(zhí)行。

如果一切正常,調(diào)度器會以上述的那種方式順暢地運(yùn)行,但這個(gè)世界沒這么美好,總有意外發(fā)生,以下分析goroutine在兩種例外情況下的行為。

Go runtime會在下面的goroutine被阻塞的情況下運(yùn)行另外一個(gè)goroutine:

用戶態(tài)阻塞/喚醒

當(dāng)goroutine因?yàn)閏hannel操作或者network I/O而阻塞時(shí)(實(shí)際上golang已經(jīng)用netpoller實(shí)現(xiàn)了goroutine網(wǎng)絡(luò)I/O阻塞不會導(dǎo)致M被阻塞,僅阻塞G,這里僅僅是舉個(gè)栗子),對應(yīng)的G會被放置到某個(gè)wait隊(duì)列(如channel的waitq),該G的狀態(tài)由_Gruning變?yōu)開Gwaitting,而M會跳過該G嘗試獲取并執(zhí)行下一個(gè)G,如果此時(shí)沒有可運(yùn)行的G供M運(yùn)行,那么M將解綁P,并進(jìn)入sleep狀態(tài);當(dāng)阻塞的G被另一端的G2喚醒時(shí)(比如channel的可讀/寫通知),G被標(biāo)記為,嘗試加入G2所在P的runnext(runnext是線程下一個(gè)需要執(zhí)行的 Goroutine。), 然后再是P的本地隊(duì)列和全局隊(duì)列。

系統(tǒng)調(diào)用阻塞

當(dāng)M執(zhí)行某一個(gè)G時(shí)候如果發(fā)生了阻塞操作,M會阻塞,如果當(dāng)前有一些G在執(zhí)行,調(diào)度器會把這個(gè)線程M從P中摘除,然后再創(chuàng)建一個(gè)新的操作系統(tǒng)的線程(如果有空閑的線程可用就復(fù)用空閑線程)來服務(wù)于這個(gè)P。當(dāng)M系統(tǒng)調(diào)用結(jié)束時(shí)候,這個(gè)G會嘗試獲取一個(gè)空閑的P執(zhí)行,并放入到這個(gè)P的本地隊(duì)列。如果獲取不到P,那么這個(gè)線程M變成休眠狀態(tài), 加入到空閑線程中,然后這個(gè)G會被放入全局隊(duì)列中。

隊(duì)列輪轉(zhuǎn)

可見每個(gè)P維護(hù)著一個(gè)包含G的隊(duì)列,不考慮G進(jìn)入系統(tǒng)調(diào)用或IO操作的情況下,P周期性的將G調(diào)度到M中執(zhí)行,執(zhí)行一小段時(shí)間,將上下文保存下來,然后將G放到隊(duì)列尾部,然后從隊(duì)列中重新取出一個(gè)G進(jìn)行調(diào)度。

除了每個(gè)P維護(hù)的G隊(duì)列以外,還有一個(gè)全局的隊(duì)列,每個(gè)P會周期性地查看全局隊(duì)列中是否有G待運(yùn)行并將其調(diào)度到M中執(zhí)行,全局隊(duì)列中G的來源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會周期性地查看全局隊(duì)列,也是為了防止全局隊(duì)列中的G被餓死。

除了每個(gè)P維護(hù)的G隊(duì)列以外,還有一個(gè)全局的隊(duì)列,每個(gè)P會周期性地查看全局隊(duì)列中是否有G待運(yùn)行并將其調(diào)度到M中執(zhí)行,全局隊(duì)列中G的來源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會周期性地查看全局隊(duì)列,也是為了防止全局隊(duì)列中的G被餓死。

M0

M0是啟動程序后的編號為0的主線程,這個(gè)M對應(yīng)的實(shí)例會在全局變量rutime.m0中,不需要在heap上分配,M0負(fù)責(zé)執(zhí)行初始化操作和啟動第一個(gè)G,在之后M0就和其他的M一樣了

G0

G0是每次啟動一個(gè)M都會第一個(gè)創(chuàng)建的goroutine,G0僅用于負(fù)責(zé)調(diào)度G,G0不指向任何可執(zhí)行的函數(shù),每個(gè)M都會有一個(gè)自己的G0,在調(diào)度或系統(tǒng)調(diào)用時(shí)會使用G0的棧空間,全局變量的G0是M0的G0

一個(gè)G由于調(diào)度被中斷,此后如何恢復(fù)?

中斷的時(shí)候?qū)⒓拇嫫骼锏臈P畔ⅲ4娴阶约旱腉對象里面。當(dāng)再次輪到自己執(zhí)行時(shí),將自己保存的棧信息復(fù)制到寄存器里面,這樣就接著上次之后運(yùn)行了。

我這里只是根據(jù)自己的理解進(jìn)行了簡單的介紹,想要詳細(xì)了解有關(guān)GMP的底層原理可以去看Go調(diào)度器 G-P-M 模型的設(shè)計(jì)者的文檔或直接看源碼

參考: ()

()

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

原文:【 】

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

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

go調(diào)用過程:

可以能,也可以不能。

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

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

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

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

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

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

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

應(yīng)用場景:

例子參考:

waitgroup

channel

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

cap:切片的容量,擴(kuò)容是以這個(gè)值為標(biāo)準(zhǔn)。默認(rèn)擴(kuò)容是2倍,當(dāng)達(dá)到1024的長度后,按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的底層是對數(shù)組的引用,因此如果兩個(gè)切片引用了同一個(gè)數(shù)組片段,就會形成共享底層數(shù)組。當(dāng)sliec發(fā)生內(nèi)存的重新分配(如擴(kuò)容)時(shí),會對共享進(jìn)行隔斷。詳細(xì)見下面例子:

make([]Type,len,cap)

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

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

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

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

使用sync.Map來管理topic,用channel來做隊(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,無法將1個(gè)G的文件全部讀到內(nèi)存進(jìn)行排序。

第一步:

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

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

第二步:

將A,B,C...10的第一個(gè)字符拿出來,對這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只請求頁面的首部。多用來判斷網(wǎng)頁是否被修改和超鏈接的有效性。

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

參考:

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

403: 拒絕訪問。

普通的http連接是客戶端連接上服務(wù)端,然后結(jié)束請求后,由客戶端或者服務(wù)端進(jìn)行http連接的關(guān)閉。下次再發(fā)送請求的時(shí)候,客戶端再發(fā)起一個(gè)連接,傳送數(shù)據(jù),關(guān)閉連接。這么個(gè)流程反復(fù)。但是一旦客戶端發(fā)送connection:keep-alive頭給服務(wù)端,且服務(wù)端也接受這個(gè)keep-alive的話,兩邊對上暗號,這個(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連接建立后,如果客戶端很長一段時(shí)間不發(fā)送消息,當(dāng)連接很久沒有收到報(bào)文,tcp會主動發(fā)送一個(gè)為空的報(bào)文(偵測包)給對方,如果對方收到了并且回復(fù)了,證明對方還在。如果對方?jīng)]有報(bào)文返回,重試多次之后則確認(rèn)連接丟失,斷開連接。

tcp的keep alive可通過

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

net.ipv4.tcp_keepalive_probes = 9 //在認(rèn)定連接失效之前,發(fā)送多少個(gè)TCP的keepalive探測包。缺省值是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是無連接狀態(tài)的。

udp相比tcp沒有建立連接的過程,所以更快,同時(shí)也更安全,不容易被攻擊。upd沒有阻塞控制,因此出現(xiàn)網(wǎng)絡(luò)阻塞不會使源主機(jī)的發(fā)送效率降低。upd支持一對多,多對多等,tcp是點(diǎn)對點(diǎn)傳輸。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報(bào)文。

time-wait作用:

解決辦法:

close_wait:

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

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

重要指標(biāo)是cardinality(不重復(fù)數(shù)量),這個(gè)數(shù)量/總行數(shù)如果過?。ㄚ吔?)代表索引基本沒意義,比如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)程號為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)程死亡時(shí),子進(jìn)程死亡時(shí)沒父進(jìn)程處理,這個(gè)死亡的子進(jìn)程就是孤兒進(jìn)程。

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

原文鏈接:

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

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

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

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

(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。強(qiáng)制殺死453進(jìn)程

git log:查看提交記錄

git diff :查看變更記錄

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

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

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

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

etcd、Consul

pprof

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

explain

其他的見:

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

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

方法一:

方法二:

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

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

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

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

推薦一個(gè)GO語言教程,最好能從最基礎(chǔ)的開始?

Go 語言被設(shè)計(jì)成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。對于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于游戲服務(wù)端的開發(fā)而言是再好不過了。最近黑馬程序員剛出了一套go語言的教程,還不錯,可以去視頻庫里下載,或者管播妞要也行。

如何學(xué)習(xí)GO語言?

Go語言也稱 Golang,兼具效率、性能、安全、健壯等特性。這套Go語言教程(Golang教程)通俗易懂,深入淺出,既適合沒有基礎(chǔ)的讀者快速入門,也適合工作多年的程序員查閱知識點(diǎn)。

Go 語言

這套教程在講解一些知識點(diǎn)時(shí),將 Go 語言和其他多種語言進(jìn)行對比,讓掌握其它編程語言的讀者能迅速理解 Go 語言的特性。Go語言從底層原生支持并發(fā),無須第三方庫、開發(fā)者的編程技巧和開發(fā)經(jīng)驗(yàn)就可以輕松搞定。

Go語言(或 Golang)起源于 2007 年,并在 2009 年正式對外發(fā)布。Go 是非常年輕的一門語言,它的主要目標(biāo)是“兼具 Python 等動態(tài)語言的開發(fā)速度和 C/C++ 等編譯型語言的性能與安全性”。

Go語言是編程語言設(shè)計(jì)的又一次嘗試,是對類C語言的重大改進(jìn),它不但能讓你訪問底層操作系統(tǒng),還提供了強(qiáng)大的網(wǎng)絡(luò)編程和并發(fā)編程支持。Go語言的用途眾多,可以進(jìn)行網(wǎng)絡(luò)編程、系統(tǒng)編程、并發(fā)編程、分布式編程。

Go語言的推出,旨在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,具有“部署簡單、并發(fā)性好、語言設(shè)計(jì)良好、執(zhí)行性能好”等優(yōu)勢,目前國內(nèi)諸多 IT 公司均已采用Go語言開發(fā)項(xiàng)目。Go語言有時(shí)候被描述為“C 類似語言”,或者是“21 世紀(jì)的C語言”。Go 從C語言繼承了相似的表達(dá)式語法、控制流結(jié)構(gòu)、基礎(chǔ)數(shù)據(jù)類型、調(diào)用參數(shù)傳值、指針等很多思想,還有C語言一直所看中的編譯后機(jī)器碼的運(yùn)行效率以及和現(xiàn)有操作系統(tǒng)的無縫適配。

因?yàn)镚o語言沒有類和繼承的概念,所以它和 Java 或 C++ 看起來并不相同。但是它通過接口(interface)的概念來實(shí)現(xiàn)多態(tài)性。Go語言有一個(gè)清晰易懂的輕量級類型系統(tǒng),在類型之間也沒有層級之說。因此可以說Go語言是一門混合型的語言。

此外,很多重要的開源項(xiàng)目都是使用Go語言開發(fā)的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。Go 是編譯型語言,Go 使用編譯器來編譯代碼。編譯器將源代碼編譯成二進(jìn)制(或字節(jié)碼)格式;在編譯代碼時(shí),編譯器檢查錯誤、優(yōu)化性能并輸出可在不同平臺上運(yùn)行的二進(jìn)制文件。要創(chuàng)建并運(yùn)行 Go 程序,程序員必須執(zhí)行如下步驟。

使用文本編輯器創(chuàng)建 Go 程序;

保存文件;編譯程序;運(yùn)行編譯得到的可執(zhí)行文件。

這不同于 Python、Ruby 和 JavaScript 等語言,它們不包含編譯步驟。Go 自帶了編譯器,因此無須單獨(dú)安裝編譯器。

鏈喬教育在線旗下學(xué)碩創(chuàng)新區(qū)塊鏈技術(shù)工作站是中國教育部學(xué)校規(guī)劃建設(shè)發(fā)展中心開展的“智慧學(xué)習(xí)工場2020-學(xué)碩創(chuàng)新工作站 ”唯一獲準(zhǔn)的“區(qū)塊鏈技術(shù)專業(yè)”試點(diǎn)工作站。專業(yè)站立足為學(xué)生提供多樣化成長路徑,推進(jìn)專業(yè)學(xué)位研究生產(chǎn)學(xué)研結(jié)合培養(yǎng)模式改革,構(gòu)建應(yīng)用型、復(fù)合型人才培養(yǎng)體系。

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

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

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

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. 說一下內(nèi)存逃逸

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

10. goroutine之間的通信方式

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

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

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

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

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

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

度 于等于【3000】。

這 有 個(gè)重點(diǎn),第 個(gè)是 ASCII字符 , ASCII字符 字符 共有256個(gè),其中128個(gè)是常

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

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

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

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

的 式實(shí)現(xiàn)。

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

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

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

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

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

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


本文題目:go語言面試視頻講解,go語言面試100題
轉(zhuǎn)載來于:http://weahome.cn/article/hohjjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部