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

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

go語(yǔ)言標(biāo)準(zhǔn)包結(jié)構(gòu) go語(yǔ)言的包管理工具

講講go語(yǔ)言的結(jié)構(gòu)體

作為C語(yǔ)言家族的一員,go和c一樣也支持結(jié)構(gòu)體??梢灶惐扔趈ava的一個(gè)POJO。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供伊川網(wǎng)站建設(shè)、伊川做網(wǎng)站、伊川網(wǎng)站設(shè)計(jì)、伊川網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、伊川企業(yè)網(wǎng)站模板建站服務(wù),10多年伊川做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

在學(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)體。

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

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

如果換行來(lái)寫

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)體字段,可以省略字段名,只寫結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名

這種方式稱為 嵌入字段

語(yǔ)法糖2:

如果是以嵌入字段形式寫的結(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ǔ)言設(shè)計(jì)與實(shí)現(xiàn)(上)

基本設(shè)計(jì)思路:

類型轉(zhuǎn)換、類型斷言、動(dòng)態(tài)派發(fā)。iface,eface。

反射對(duì)象具有的方法:

編譯優(yōu)化:

內(nèi)部實(shí)現(xiàn):

實(shí)現(xiàn) Context 接口有以下幾個(gè)類型(空實(shí)現(xiàn)就忽略了):

互斥鎖的控制邏輯:

設(shè)計(jì)思路:

(以上為寫被讀阻塞,下面是讀被寫阻塞)

總結(jié),讀寫鎖的設(shè)計(jì)還是非常巧妙的:

設(shè)計(jì)思路:

WaitGroup 有三個(gè)暴露的函數(shù):

部件:

設(shè)計(jì)思路:

結(jié)構(gòu):

Once 只暴露了一個(gè)方法:

實(shí)現(xiàn):

三個(gè)關(guān)鍵點(diǎn):

細(xì)節(jié):

讓多協(xié)程任務(wù)的開(kāi)始執(zhí)行時(shí)間可控(按順序或歸一)。(Context 是控制結(jié)束時(shí)間)

設(shè)計(jì)思路: 通過(guò)一個(gè)鎖和內(nèi)置的 notifyList 隊(duì)列實(shí)現(xiàn),Wait() 會(huì)生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號(hào)通知一個(gè)(Signal())或所有(Boardcast())等待者(內(nèi)部實(shí)現(xiàn)是通過(guò)票據(jù)通知的)來(lái)控制協(xié)程解除阻塞。

暴露四個(gè)函數(shù):

實(shí)現(xiàn)細(xì)節(jié):

部件:

包: golang.org/x/sync/errgroup

作用:開(kāi)啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過(guò)程并收集首次 err 錯(cuò)誤。通過(guò) Context 的傳入,還可以控制在首次 err 出現(xiàn)時(shí)就終止組內(nèi)各協(xié)程。

設(shè)計(jì)思路:

結(jié)構(gòu):

暴露的方法:

實(shí)現(xiàn)細(xì)節(jié):

注意問(wèn)題:

包: "golang.org/x/sync/semaphore"

作用:排隊(duì)借資源(如錢,有借有還)的一種場(chǎng)景。此包相當(dāng)于對(duì)底層信號(hào)量的一種暴露。

設(shè)計(jì)思路:有一定數(shù)量的資源 Weight,每一個(gè) waiter 攜帶一個(gè) channel 和要借的數(shù)量 n。通過(guò)隊(duì)列排隊(duì)執(zhí)行借貸。

結(jié)構(gòu):

暴露方法:

細(xì)節(jié):

部件:

細(xì)節(jié):

包: "golang.org/x/sync/singleflight"

作用:防擊穿。瞬時(shí)的相同請(qǐng)求只調(diào)用一次,response 被所有相同請(qǐng)求共享。

設(shè)計(jì)思路:按請(qǐng)求的 key 分組(一個(gè) *call 是一個(gè)組,用 map 映射存儲(chǔ)組),每個(gè)組只進(jìn)行一次訪問(wèn),組內(nèi)每個(gè)協(xié)程會(huì)獲得對(duì)應(yīng)結(jié)果的一個(gè)拷貝。

結(jié)構(gòu):

邏輯:

細(xì)節(jié):

部件:

如有錯(cuò)誤,請(qǐng)批評(píng)指正。

4.1 Go語(yǔ)言中包(Packages)基礎(chǔ)知識(shí)

先看一下目錄結(jié)構(gòu),注意這里的src名稱是必須的,go在設(shè)置了GOPATH后,默認(rèn)會(huì)添加src去尋找package,暫未查詢是否有方法不按照src查詢

根據(jù)上面的描述,Go語(yǔ)言中通過(guò)包中函數(shù)的名稱來(lái)區(qū)分公共函數(shù)和私有函數(shù),我們?cè)趍ain函數(shù)中是無(wú)法調(diào)用myPrivateFunc的

此時(shí)如果執(zhí)行通過(guò)go run方式執(zhí)行,會(huì)看到如下的提示信息,這與大部分語(yǔ)言對(duì)于包管理方式相關(guān),所以我們通過(guò)兩種不同的方法來(lái)讓代碼執(zhí)行起來(lái)

返回如下,這里面對(duì)我們后續(xù)執(zhí)行有影響的兩個(gè)參數(shù)GO111MODULE和GOPATH

如果要使用gopath模式引用包,則需要關(guān)閉mod模式

設(shè)置GOPATH為當(dāng)前路徑,即main.go所在的路徑

此時(shí)再查看go env時(shí),GOPATH已經(jīng)發(fā)生改變

我們?cè)俅螄L試執(zhí)行代碼

可以看到public函數(shù)被調(diào)用


分享文章:go語(yǔ)言標(biāo)準(zhǔn)包結(jié)構(gòu) go語(yǔ)言的包管理工具
瀏覽路徑:http://weahome.cn/article/dosgesh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部