修改參數(shù)
南芬網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),南芬網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為南芬成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的南芬做網(wǎng)站的公司定做!
值類(lèi)型
指針類(lèi)型
引用類(lèi)型
chan
類(lèi)型零值
總結(jié) :在Go語(yǔ)言中, 函數(shù)的參數(shù)傳遞只有值傳遞 ,而且傳遞的實(shí)參都是原始數(shù)據(jù)的一份拷貝。如果拷貝的內(nèi)容是值類(lèi)型的,那么在函數(shù)中無(wú)法修改原始數(shù)據(jù),如果拷貝的內(nèi)容是指針(或者可以理解為引用類(lèi)型),那么可以在函數(shù)中修改原始數(shù)據(jù)。
第一個(gè)問(wèn)題,打開(kāi)文件應(yīng)添加"|os.O_WRONLY" file, err := os.OpenFile("data.dat",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0777) 第二個(gè)問(wèn)題,將Count方法中的 "ch
Hello,大家好,又見(jiàn)面了!上一遍我們將 channel 相關(guān)基礎(chǔ)以及使用場(chǎng)景。這一篇,還需要再次進(jìn)階理解channel 阻塞問(wèn)題。以下創(chuàng)建一個(gè)chan類(lèi)型為int,cap 為3。
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.” 你可以看看這本書(shū)名叫:Effective Go
如果接收者,接收一個(gè)空對(duì)象,也會(huì)發(fā)生什么情況?
代碼示例 :
也會(huì)報(bào)錯(cuò)如下:
上面,從 chan 取出數(shù)據(jù),可是沒(méi)有數(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)阻塞了,然后我們直接這么干肯定沒(méi)有什么毛病,而且效率提高了,不需要再次放入buf再取出,這個(gè)過(guò)程也是需要時(shí)間。不然,不得往chan添加數(shù)據(jù)需要加鎖、拷貝、解鎖一序列操作,那肯定就慢了,我想Go語(yǔ)言是為了高效及內(nèi)存使用率的考慮這樣設(shè)計(jì)的。(注意,一般都是在runtime里面完成,不然會(huì)出現(xiàn)象安全問(wèn)題。)
總結(jié) :
chan 類(lèi)型的特點(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)面試題: