go語言結構體包含結構體 go語言構造函數(shù)

講講go語言的結構體

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

創(chuàng)新互聯(lián)自2013年起,先為崇陽等服務建站,崇陽等地企業(yè),進行企業(yè)商務咨詢服務。為崇陽企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

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

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

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

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

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

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

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

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

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

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

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

還有一個點提一下

如果換行來寫

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

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

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

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

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

有什么用呢?

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

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

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

語法糖1:

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

這種方式稱為 嵌入字段

語法糖2:

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

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

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

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

tag的格式為反單引號

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

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

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

go中的struct

go和其他語言一樣,可以申明新的“結構體”,struct可以作為其他類型的屬性活字段的容器,定義方式如下:

type 關鍵字申明 person 為 struct 類型,person包含 name 屬性和 age 屬性,對應的類型為 string 和 int 。我們看看如何使用struct:

除了上面使用的方式使用 struct ,還有三種方式可以使用申明struct類型

完整是使用struct 例子

當我們創(chuàng)建結構體時,字段可以只有類型,而沒有字段名。這樣的字段稱為匿名字段(Anonymous Field)。習慣上匿名字段叫內嵌,具名字段叫組合

上面我們申明了兩個結構體 Student 和 Person ,其中 Student 組合了 Person 字段,那么 Student 包含了 Person 中的所有字段

從上面的例子可以看出來,struct 不僅可以將struct作為匿名字段,自定義類型、內置類型都可以作為匿名字段,也可以進行相應的函數(shù)操作。

這里我們有個問題,Person上有一個name屬性,如果Student上也有一個name屬性,那么我們怎么辦呢?其實在go里面,最外層的屬性具有有限的訪問權限,當你通過Student.name訪問的時候是訪問Student上的屬性。同理,我們可以通過Student.Person訪問Person上的屬性,如:

如果結構體的全部成員都是可以比較的,那么結構體也是可以比較的,那樣的話兩個結構體將可以使用 == 或 != 運算符進行比較,但不支持 或 。

go語言結構體變量和結構體指針變量的區(qū)別

主要看優(yōu)先級別,-比++的優(yōu)先級別高,++p-num,因為-優(yōu)先級別高,所以先算p-num,然后num++,p++-num,先算p-num,然后p++

Go 空結構體 struct{} 的使用

struct是Go中的關鍵字,用于定義結構類型。

例如:

struct {}是一個無元素的結構體類型,通常在沒有信息存儲時使用。優(yōu)點是大小為0,不需要內存來存儲struct {}類型的值。

struct {} {}是一個復合字面量,它構造了一個struct {}類型的值,該值也是空。

go中可以使用 unsafe.Sizeof 計算出一個數(shù)據(jù)類型實例需要占用的字節(jié)數(shù)。我們驗證一下:

也就是說空結構體實例不占用任何內存空間。

Go 語言標準庫沒有提供 Set 的實現(xiàn),通常使用 map 來代替。事實上,對于集合來說,只需要 map 的鍵,而不需要值。

聲明為聲明為 map[string]struct{} ,由于struct{}是空,不關心內容,這樣map便改造為set 。

map可以通過“comma ok”機制來獲取該key是否存在,例如 _, ok := map["key"] ,如果沒有對應的值,ok為false??梢酝ㄟ^定義成 map[string]struct{} 的形式,值不再占用內存。其值僅有兩種狀態(tài),有或無。如果定義的是 map[string]bool ,則結果有true、false或沒有三種狀態(tài),而且即使是將值設置為 bool 類型,也會多占據(jù) 1 個字節(jié)。因此呢,將 map 作為集合(Set)使用時,可以將值類型定義為空結構體,僅作為占位符使用即可。

基于channels發(fā)送消息有兩個重要方面:發(fā)了消息、發(fā)了什么消息。一個強調了通訊的發(fā)生,一個強調了通訊的內容。當我們更希望強調通訊發(fā)生的時刻時,我們將它稱為 消息事件 。有些消息事件并不攜帶額外的信息,它僅僅是用作兩個goroutine之間的同步,這時候我們可以用 struct{} 空結構體作為channels元素的類型。用來通知子協(xié)程(goroutine)執(zhí)行任務,或只用來控制協(xié)程并發(fā)度。

在部分場景下,結構體只包含方法,不包含任何的字段。這時候我們就可以使用空結構體。

其實,上面的calculateInt 可以是任何類型,如 type calculateInt bool ,但是struct{}不占用任何空間,邏輯上也更合理,因此還是它最好。

Go語言之結構體嵌套

在type Student2 struct結構體中,注意book參數(shù)引用的是地址,方便修改數(shù)據(jù)

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

目錄

一、結構體詳解

1. 結構體定義

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

二、結構體方法

1. 結構體的方法定義

2. 結構體內自定義方法的引用

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 {

字段名 字段類型

字段名 字段類型 …

}

其中:

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

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

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

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

方法的定義格式如下:

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

函數(shù)體

}

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

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

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

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

文章名稱:go語言結構體包含結構體 go語言構造函數(shù)
路徑分享:http://muchs.cn/article40/hjcieo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站營銷、微信小程序用戶體驗、ChatGPT、云服務器、網站排名

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網站建設