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

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

go語言包結構 go語言開發(fā)框架

Golang常用包有哪些

⑴ Go Kit

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站設計、網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務郾城,10年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108

它本身不是一個框架,而是一套微服務工具集,可以用于解決分布式系統(tǒng)開發(fā)中的大多數(shù)常見問題,所以使用者可以專注于你的業(yè)務邏輯中。

⑵ Gingko

是一個Go測試框架,目的是幫助我們使用行為驅動開發(fā)風格高效地編寫富有表現(xiàn)力和全面的測試,它有著非常良好的幫助文檔,任何人都可以輕松地在項目中集成使用它。

⑶ NSQ

實時分布式消息傳遞平臺,提供高可用性和可靠的消息傳遞保證,可以水平擴展,支持負載均衡,安裝部署非常方便。

⑷ Goose

Golang中最佳的數(shù)據(jù)庫遷移包,通過創(chuàng)建增量SQL更改和Go函數(shù)來管理數(shù)據(jù)庫結構,在Go1.16版本以上,還支持了嵌入式sql遷移。

⑸ GORM

是一個功能齊全的Golang對象關系映射庫,是一種開發(fā)人員友好的工具,用于在不兼容的類型系統(tǒng)之間轉換數(shù)據(jù),專門設計用于在類型系統(tǒng)之間切換時最大限度地減少重寫代碼。

⑹ Authboss

一個模塊化的身份驗證包,使用它你可以快速地在項目中進行身份驗證管理。它有幾個常見的身份驗證和授權模塊供開發(fā)人員選擇。

⑺ cli

是一個簡單快捷的命令行管理包,用于為Go語言構建命令行應用程序,允許開發(fā)人員開發(fā)自己的富有表現(xiàn)力的命令行應用程序,用于創(chuàng)建標志、bash完成例程并生成幫助文本。

⑻ Vegeta

是一個用于HTTP負載測試的工具包,這個多功能工具專為測試具有恒定請求率的HTTP服務而設計。它可以有效地分析程序中的潛在問題,是一個始終貫穿以提高整體性能為目的的包。

golang中級進階(二):結構體

目錄

一、結構體詳解

1. 結構體定義

2. 實例化結構體的7種方法

二、結構體方法

1. 結構體的方法定義

2. 結構體內(nèi)自定義方法的引用

3. 任意類型添加方法

三、嵌套、繼承

1. 匿名結構體

2. 結構體中可以定義任意類型的字段

3. 結構體嵌套結構體

4. 結構體嵌套匿名結構體

5. 結構體嵌套多個匿名結構體

6. 結構體繼承

四、結構體和JSON相互轉換

1. 結構體轉化成json

2. json轉化成結構體

3. 結構體標簽 tag

4. 嵌套結構體和json的序列化反序列化

Golang 中沒有“類”的概念,Golang 中的結構體和其他語言中的類有點相似。和其他面向對 象語言中的類相比,Golang 中的結構體具有更高的擴展性和靈活性。

Golang 中的基礎數(shù)據(jù)類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全 部或部分屬性時,這時候再用單一的基本數(shù)據(jù)類型就無法滿足需求了,Golang 提供了一種 自定義數(shù)據(jù)類型,可以封裝多個基本數(shù)據(jù)類型,這種數(shù)據(jù)類型叫結構體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。

使用 type 和 struct 關鍵字來定義結構體,具體代碼格式如下:

type 類型名 struct {

字段名 字段類型

字段名 字段類型 …

}

其中:

? 類型名:表示自定義結構體的名稱,在同一個包內(nèi)不能重復。

? 字段名:表示結構體字段名。結構體中的字段名必須唯一。

? 字段類型:表示結構體字段的具體類型。

在 go 語言中,沒有類的概念但是可以給類型(結構體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數(shù)。接收者的概念就類似于其他語言中的 this 或者 self。

方法的定義格式如下:

func (接收者變量 接收者類型) 方法名(參數(shù)列表) (返回參數(shù)) {

函數(shù)體

}

注意:想改變結構體內(nèi)的值,必須先變成指針。

在 Go 語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基于內(nèi)置的 int 類型使用 type 關鍵字可以定義新的自定義類型,然后為我們 的自定義類型添加方法。

注意:匿名結構體中不允許出現(xiàn)多個重復的類型

注意:如果結構體里面有私有屬性也就是小寫定義的字段,則不會被json使用

golang中包循環(huán)依賴問題

一、go中為什么不允許循環(huán)依賴

二、如何解決循環(huán)依賴

循環(huán)依賴就是A引用B,B又引用A,形成了一個包引用的閉環(huán)。要解決循環(huán)引用,就是打破這個閉環(huán),讓A引用B,B不能引用A??聪旅娴睦樱?/p>

包結構如下:

執(zhí)行main函數(shù)報錯:

報錯的原因是 我們在執(zhí)行bagA.PrintA()的時候,引用了A包,A包又引用了B包,B包又引用了A包,形成了循環(huán)依賴。那我們打破依賴就可以了。

那么該怎么打破呢?

我們發(fā)現(xiàn)A包引用B包,是因為A包需要調用B包的bagB.GetName()方法;同樣的,B包引用A包,是因為B包需要調用A包的bagA.GetName()方法。那么,我們有沒有不需要引包就能使B包可以調用A包的方法呢?

當然是有的。看下面:

我們在B包里定義了一個方法變量AHandler,并且提供了為這個方法變量賦值的方法Register(),然后在A包里的init()方法里,調用B包的Register()方法,將A包的GetName方法復賦值給了AHandler變量。 這樣,在B包執(zhí)行方法AHandler是不是就相當于調用了A包的GetName方法呢?看執(zhí)行結果:

總結:

上述解決辦法的核心邏輯就是,B包使用一個方法變量來替代A中的方法(來完成B不引用A),A來為該變量賦值(因為A引用B,A可以調用B的方法來完成賦值)。 解決循環(huán)依賴問題,思想就是打破包的循環(huán)依賴,以不導包的方式調用其他包的方法。所以,采用接口的形式也可以解決循環(huán)依賴(B定義一個接口,A中你想要調用的方法實現(xiàn)了該接口,A中完成接口變量賦值,B來調用接口方法,有時間再補充例子吧)

講講go語言的結構體

作為C語言家族的一員,go和c一樣也支持結構體??梢灶惐扔趈ava的一個POJO。

在學習定義結構體之前,先學習下定義一個新類型。

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

這里要引入一個底層類型的概念。

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

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

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

底層類型是很重要的,因為對兩個變量進行顯式的類型轉換,只有底層類型相同的變量間才能相互轉換。底層類型是判斷兩個類型本質上是否相同的根本。

這種類型定義方式通常用在 項目的漸進式重構,還有對已有包的二次封裝方面

類型別名表示新類型和原類型完全等價,實際上就是同一種類型。只不過名字不同而已。

一般我們都是定義一個有名的結構體。

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

還有一個點提一下

如果換行來寫

Age: 66,后面這個都好不能省略

還有一個點,觀察e3的賦值

new返回的是一個指針。然后指針可以直接點號賦值。這說明go默認進行了取值操作

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

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

有什么用呢?

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

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

這種形式需要說的是幾個語法糖。

語法糖1:

對于結構體字段,可以省略字段名,只寫結構體名。默認字段名就是結構體名

這種方式稱為 嵌入字段

語法糖2:

如果是以嵌入字段形式寫的結構體

可以省略嵌入的Reader字段,而直接訪問ReaderName

此時book是一個各個屬性全是對應類型零值的一個實例。不是nil。這種情況在Go中稱為零值可用。不像java會導致npe

結構體定義時可以在字段后面追加標簽說明。

tag的格式為反單引號

tag的作用是可以使用[反射]來檢視字段的標簽信息。

具體的作用還要看使用的場景。

比如這里的tag是為了幫助 encoding/json 標準包在解析對象時可以利用的規(guī)則。比如omitempty表示該字段沒有值就不打印出來。

4.1 Go語言中包(Packages)基礎知識

先看一下目錄結構,注意這里的src名稱是必須的,go在設置了GOPATH后,默認會添加src去尋找package,暫未查詢是否有方法不按照src查詢

根據(jù)上面的描述,Go語言中通過包中函數(shù)的名稱來區(qū)分公共函數(shù)和私有函數(shù),我們在main函數(shù)中是無法調用myPrivateFunc的

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

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

如果要使用gopath模式引用包,則需要關閉mod模式

設置GOPATH為當前路徑,即main.go所在的路徑

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

我們再次嘗試執(zhí)行代碼

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

4.2 Go語言中包(Packages)的命名

包名本質上是所在目錄的名稱,我們在基礎知識演示用例中進行擴展,進一步理解包名,執(zhí)行前需要執(zhí)行的命令請參考上一節(jié),首先來看一下目錄結構:

此時,如果我們想使用subpackage/sub/subfunc.go時,需要import的是subpackage/sub,而不是subpackage/sub/subfunc,來看具體的實現(xiàn):

我們回到使用的主函數(shù)中,我們在主函數(shù)中引入"subpackage/sub",而調用中直接使用了文件名稱myfunc

執(zhí)行的結果如下


網(wǎng)站欄目:go語言包結構 go語言開發(fā)框架
鏈接URL:http://weahome.cn/article/hhhsss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部