Go語言中沒有“類”的概念,也不支持“類”的繼承等面向對象的概念。Go語言中通過結構體的內嵌再配合接口比面向對象具有更高的擴展性和靈活性。
為富川等地區用戶提供了全套網頁設計制作服務,及富川網站建設行業解決方案。主營業務為成都網站設計、成都網站建設、富川網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
自定義類型
在Go語言中有一些基本的數據類型,如string、整型、浮點型、布爾等數據類型, Go語言中可以使用type關鍵字來定義自定義類型。
自定義類型是定義了一個全新的類型。我們可以基于內置的基本類型定義,也可以通過struct定義。例如:
通過Type關鍵字的定義,MyInt就是一種新的類型,它具有int的特性。
類型別名
類型別名是Go1.9版本添加的新功能。
類型別名規定:TypeAlias只是Type的別名,本質上TypeAlias與Type是同一個類型。就像一個孩子小時候有小名、乳名,上學后用學名,英語老師又會給他起英文名,但這些名字都指的是他本人。
type TypeAlias = Type
我們之前見過的rune和byte就是類型別名,他們的定義如下:
類型定義和類型別名的區別
類型別名與類型定義表面上看只有一個等號的差異,我們通過下面的這段代碼來理解它們之間的區別。
結果顯示a的類型是main.NewInt,表示main包下定義的NewInt類型。b的類型是int。MyInt類型只會在代碼中存在,編譯完成時并不會有MyInt類型。
Go語言中的基礎數據類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全部或部分屬性時,這時候再用單一的基本數據類型明顯就無法滿足需求了,Go語言提供了一種自定義數據類型,可以封裝多個基本數據類型,這種數據類型叫結構體,英文名稱struct。 也就是我們可以通過struct來定義自己的類型了。
Go語言中通過struct來實現面向對象。
結構體的定義
使用type和struct關鍵字來定義結構體,具體代碼格式如下:
其中:
舉個例子,我們定義一個Person(人)結構體,代碼如下:
同樣類型的字段也可以寫在一行,
這樣我們就擁有了一個person的自定義類型,它有name、city、age三個字段,分別表示姓名、城市和年齡。這樣我們使用這個person結構體就能夠很方便的在程序中表示和存儲人信息了。
語言內置的基礎數據類型是用來描述一個值的,而結構體是用來描述一組值的。比如一個人有名字、年齡和居住城市等,本質上是一種聚合型的數據類型
結構體實例化
只有當結構體實例化時,才會真正地分配內存。也就是必須實例化后才能使用結構體的字段。
基本實例化
舉個例子:
我們通過.來訪問結構體的字段(成員變量),例如p1.name和p1.age等。
匿名結構體
在定義一些臨時數據結構等場景下還可以使用匿名結構體。
創建指針類型結構體
我們還可以通過使用new關鍵字對結構體進行實例化,得到的是結構體的地址。 格式如下:
從打印的結果中我們可以看出p2是一個結構體指針。
需要注意的是在Go語言中支持對結構體指針直接使用.來訪問結構體的成員。
取結構體的地址實例化
使用對結構體進行取地址操作相當于對該結構體類型進行了一次new實例化操作。
p3.name = "七米"其實在底層是(*p3).name = "七米",這是Go語言幫我們實現的語法糖。
結構體初始化
沒有初始化的結構體,其成員變量都是對應其類型的零值。
使用鍵值對初始化
使用鍵值對對結構體進行初始化時,鍵對應結構體的字段,值對應該字段的初始值。
也可以對結構體指針進行鍵值對初始化,例如:
當某些字段沒有初始值的時候,該字段可以不寫。此時,沒有指定初始值的字段的值就是該字段類型的零值。
使用值的列表初始化
初始化結構體的時候可以簡寫,也就是初始化的時候不寫鍵,直接寫值:
使用這種格式初始化時,需要注意:
結構體內存布局
結構體占用一塊連續的內存。
輸出:
【進階知識點】關于Go語言中的內存對齊推薦閱讀:在 Go 中恰到好處的內存對齊
面試題
請問下面代碼的執行結果是什么?
構造函數
Go語言的結構體沒有構造函數,我們可以自己實現。 例如,下方的代碼就實現了一個person的構造函數。 因為struct是值類型,如果結構體比較復雜的話,值拷貝性能開銷會比較大,所以該構造函數返回的是結構體指針類型。
調用構造函數
方法和接收者
Go語言中的方法(Method)是一種作用于特定類型變量的函數。這種特定類型變量叫做接收者(Receiver)。接收者的概念就類似于其他語言中的this或者 self。
方法的定義格式如下:
其中,
舉個例子:
方法與函數的區別是,函數不屬于任何類型,方法屬于特定的類型。
指針類型的接收者
指針類型的接收者由一個結構體的指針組成,由于指針的特性,調用方法時修改接收者指針的任意成員變量,在方法結束后,修改都是有效的。這種方式就十分接近于其他語言中面向對象中的this或者self。 例如我們為Person添加一個SetAge方法,來修改實例變量的年齡。
調用該方法:
值類型的接收者
當方法作用于值類型接收者時,Go語言會在代碼運行時將接收者的值復制一份。在值類型接收者的方法中可以獲取接收者的成員值,但修改操作只是針對副本,無法修改接收者變量本身。
什么時候應該使用指針類型接收者
任意類型添加方法
在Go語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基于內置的int類型使用type關鍵字可以定義新的自定義類型,然后為我們的自定義類型添加方法。
注意事項: 非本地類型不能定義方法,也就是說我們不能給別的包的類型定義方法。
結構體的匿名字段
匿名字段默認采用類型名作為字段名,結構體要求字段名稱必須唯一,因此一個結構體中同種類型的匿名字段只能有一個。
嵌套結構體
一個結構體中可以嵌套包含另一個結構體或結構體指針。
嵌套匿名結構體
當訪問結構體成員時會先在結構體中查找該字段,找不到再去匿名結構體中查找。
嵌套結構體的字段名沖突
嵌套結構體內部可能存在相同的字段名。這個時候為了避免歧義需要指定具體的內嵌結構體的字段。
結構體的“繼承”
Go語言中使用結構體也可以實現其他編程語言中面向對象的繼承。
結構體字段的可見性
結構體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當前結構體的包中可訪問)。
結構體與JSON序列化
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。JSON鍵值對是用來保存JS對象的一種方式,鍵/值對組合中的鍵名寫在前面并用雙引號""包裹,使用冒號:分隔,然后緊接著值;多個鍵值之間使用英文,分隔。
結構體標簽(Tag)
Tag是結構體的元信息,可以在運行的時候通過反射的機制讀取出來。 Tag在結構體字段的后方定義,由一對反引號包裹起來,具體的格式如下:
`key1:"value1" key2:"value2"`
結構體標簽由一個或多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個空格分隔。 注意事項: 為結構體編寫Tag時,必須嚴格遵守鍵值對的規則。結構體標簽的解析代碼的容錯能力很差,一旦格式寫錯,編譯和運行時都不會提示任何錯誤,通過反射也無法正確取值。例如不要在key和value之間添加空格。
例如我們為Student結構體的每個字段定義json序列化時使用的Tag:
于c語言相同,go中也有指針和結構體的概念。指針表示變量的內存地址,結構體用來存儲同一類型的數據。
定義一個指針變量,將變量a的地址賦給指針變量p。這樣,指針變量p也就指向了變量a所在的內容空間。
new 函數返回一個指針變量
fmt.scan() 就是傳入一個指針變量。
兩種方法都可以使用。
以上簡要介紹了go語言中的指針和結構體。
目錄
一、結構體詳解
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 中的基礎數據類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全 部或部分屬性時,這時候再用單一的基本數據類型就無法滿足需求了,Golang 提供了一種 自定義數據類型,可以封裝多個基本數據類型,這種數據類型叫結構體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。
使用 type 和 struct 關鍵字來定義結構體,具體代碼格式如下:
type 類型名 struct {
字段名 字段類型
字段名 字段類型 …
}
其中:
? 類型名:表示自定義結構體的名稱,在同一個包內不能重復。
? 字段名:表示結構體字段名。結構體中的字段名必須唯一。
? 字段類型:表示結構體字段的具體類型。
在 go 語言中,沒有類的概念但是可以給類型(結構體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數。接收者的概念就類似于其他語言中的 this 或者 self。
方法的定義格式如下:
func (接收者變量 接收者類型) 方法名(參數列表) (返回參數) {
函數體
}
注意:想改變結構體內的值,必須先變成指針。
在 Go 語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基于內置的 int 類型使用 type 關鍵字可以定義新的自定義類型,然后為我們 的自定義類型添加方法。
注意:匿名結構體中不允許出現多個重復的類型
注意:如果結構體里面有私有屬性也就是小寫定義的字段,則不會被json使用
網站名稱:go語言結構體定義 go語言構造函數
標題鏈接:http://m.newbst.com/article8/doiheop.html
成都網站建設公司_創新互聯,為您提供網頁設計公司、外貿建站、云服務器、網站營銷、定制開發、商城網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯