bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

go語(yǔ)言結(jié)構(gòu)體chan go語(yǔ)言結(jié)構(gòu)體數(shù)組賦值

golang - channel

通過(guò)var聲明或者make函數(shù)創(chuàng)建的channel變量是一個(gè)存儲(chǔ)在函數(shù)棧幀上的指針,占用8個(gè)字節(jié),指向堆上的hchan結(jié)構(gòu)體

在墨脫等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,墨脫網(wǎng)站建設(shè)費(fèi)用合理。

源碼包中src/runtime/chan.go定義了hchan的數(shù)據(jù)結(jié)構(gòu)如下:

hchan結(jié)構(gòu)體的主要組成部分有四個(gè):

用來(lái)保存goroutine之間傳遞數(shù)據(jù)的循環(huán)數(shù)組:buf

用來(lái)記錄此循環(huán)數(shù)組當(dāng)前發(fā)送或接收數(shù)據(jù)的下標(biāo)值:sendx和recvx

用于保存向該chan發(fā)送和從該chan接收數(shù)據(jù)被阻塞的goroutine隊(duì)列: sendq 和 recvq

保證channel寫(xiě)入和讀取數(shù)據(jù)時(shí)線程安全的鎖:lock

環(huán)形數(shù)組作為channel 的緩沖區(qū) 數(shù)組的納圓長(zhǎng)度就是定義channnel 時(shí)channel 的緩沖大小

在hchan 中包括了讀/寫(xiě) 等待隊(duì)列, waitq是一個(gè)雙向隊(duì)列,包括了一個(gè)頭結(jié)點(diǎn)和尾節(jié)點(diǎn)。 每個(gè)節(jié)點(diǎn)是一個(gè)sudog結(jié)構(gòu)體變量

channel有2種類型:無(wú)緩沖、有緩沖, 在創(chuàng)建時(shí) make(chan type cap) 通過(guò)cap 設(shè)定緩沖大小

channel有3種模式:寫(xiě)操作模式(單向通道)、讀操作模式(單向通道)、讀寫(xiě)操作模式(雙向通道)

channel有3種狀態(tài):未初始化、正常、關(guān)閉

如下幾種狀態(tài)會(huì)引發(fā)panic

channel 是線程安全的,channel的底層實(shí)現(xiàn)中,hchan結(jié)構(gòu)體中采用Mutex鎖來(lái)保證數(shù)據(jù)讀寫(xiě)安全。在對(duì)循環(huán)數(shù)組buf中的數(shù)據(jù)進(jìn)行入肢信隊(duì)和出隊(duì)操作時(shí),必須先獲取洞饑塌互斥鎖,才能操作channel數(shù)據(jù)

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

Hello,大家好,又見(jiàn)面了!上一遍亂肢我們將 channel 相關(guān)基礎(chǔ)以及使用場(chǎng)景。這一篇,還需要再次進(jìn)階理解channel 阻塞問(wèn)題。以下創(chuàng)建一個(gè)chan類型為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 類型的特點(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ǔ)言的結(jié)構(gòu)體

作為C語(yǔ)言家族的一員,go和c一樣也支持結(jié)構(gòu)體。可以類比于java的一個(gè)POJO。

在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個(gè)新類型。

新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。

這里要引入一個(gè)底層類型的概念。

如果一個(gè)新類型是基于某個(gè) Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型

在上面的例子中,int就是T1的底層類型。

但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int

底層類型是很重要的,因?yàn)閷?duì)兩個(gè)變量進(jìn)行顯式的類型轉(zhuǎn)換,只有底層類型相同的變量間才能相互轉(zhuǎn)換。底層類型是判斷兩個(gè)類型本質(zhì)上是否相同的根本。

這種類型定義方式通常用在 項(xiàng)目的漸進(jìn)梁讓式重構(gòu),還有對(duì)已有包的二次封裝方面

類型別名表示新類型和原類型完全等價(jià),實(shí)際上就是同一種類型。只不過(guò)名字不同而已。

一般我們都是定義一個(gè)有名的結(jié)構(gòu)體。

字段名的大小寫(xiě)決定了字段是否包外可用。只有大寫(xiě)的字段可以被包外引用。

還有一個(gè)點(diǎn)提一下

如果換行來(lái)寫(xiě)

Age: 66,后面這個(gè)都好不能省略

還有一個(gè)點(diǎn),觀察e3的賦值

new返回的是一個(gè)指針。然后指針可以直接點(diǎn)號(hào)賦值。這說(shuō)明go默認(rèn)進(jìn)行了取值操作

e3.Age 等價(jià)于 (*e3).Age

如上定義了一個(gè)空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。

有什么用呢?

基于空結(jié)構(gòu)體類型內(nèi)存零開(kāi)銷這樣的特性,我們?cè)谌粘?Go 開(kāi)發(fā)中會(huì)經(jīng)常使用空 結(jié)構(gòu)體類型元素,作為一種“事件”信息進(jìn)行 Goroutine 之間的通信

這種以空結(jié)構(gòu)體為元素類建立的 channel,是目前能實(shí)現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。

這種形式需要說(shuō)的是幾個(gè)語(yǔ)法糖。

語(yǔ)法糖1:

對(duì)于結(jié)構(gòu)體字段,可以省略字段名,只寫(xiě)結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名

這種方式稱為 嵌入字段

語(yǔ)法糖2:

如果是以嵌入字段形式寫(xiě)的結(jié)構(gòu)體

可以省略嵌入的Reader字段,而直接訪問(wèn)ReaderName

此時(shí)book是一個(gè)各個(gè)屬性全是對(duì)應(yīng)類型零值的一個(gè)實(shí)例。不是nil。這種情況在Go中稱為零值可用。不像java會(huì)基灶導(dǎo)致npe

結(jié)構(gòu)體定義時(shí)可以在字段后面追加標(biāo)簽說(shuō)明。

tag的格式為反單引號(hào)

tag的橡鋒局作用是可以使用[反射]來(lái)檢視字段的標(biāo)簽信息。

具體的作用還要看使用的場(chǎng)景。

比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對(duì)象時(shí)可以利用的規(guī)則。比如omitempty表示該字段沒(méi)有值就不打印出來(lái)。

文章題目:go語(yǔ)言結(jié)構(gòu)體chan go語(yǔ)言結(jié)構(gòu)體數(shù)組賦值
轉(zhuǎn)載來(lái)源:http://vcdvsql.cn/article18/ddpehgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化企業(yè)建站關(guān)鍵詞優(yōu)化網(wǎng)站設(shè)計(jì)品牌網(wǎng)站制作靜態(tài)網(wǎng)站

廣告

聲明:本網(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)

成都網(wǎng)站建設(shè)