005 go-高階資料型別(結構體和方法)
自我理解:
結構體更像類的定義(可以有屬性和方法)
一、結構體定義
go語言的結構體型別(struct)比函式型別更加靈活。它可以封裝屬性和操作。前者即是結構體型別中的字段,而後者則是結構體型別所擁有的方法。
二、結構體宣告
結構體型別的字面量由關鍵字type、型別名稱、關鍵字struct,以及由花括號包裹的若干字段宣告組成。其中,每個字段宣告獨佔一行並由欄位名稱(可選)和字段型別組成。示例如下:
type person struct
三、結構體值型別建立——結構體的值
person
或者(值的順序 如果和 值)
person
當然,我們在編寫某個結構體型別的值字面量時可以只對它的部分字段賦值,甚至不對它的任何字段賦值。這時,未被顯式賦值的字段的值則為其型別的零值。注意,在上述兩種情況下,欄位的名稱是不能被省略的。
例如:// 忽略的字段為 0 或 空 fmt.println(books)
四、建立匿名結構體
我們依照結構體型別person建立乙個匿名結構體:
p := struct
匿名結構體的用途:
匿名結構體最大的用處就是在內部臨時建立乙個結構以封裝資料,而不必正式為其宣告相關規則。而在涉及到對外的場景中,我強烈建議使用正式的結構體型別。
五、結構體方法定義
結構體型別可以擁有若干方法(注意,匿名結構體是不可能擁有方法的)。所謂方法,其實就是一種特殊的函式。它可以依附於某個自定義型別。方法的特殊在於它的宣告包含了乙個接收者宣告。這裡的接收者指代它所依附的那個型別。我們仍以結構體型別person為例。下面是依附於它的乙個名為grow的方法的宣告:
func (person *person) grow()
說明: 如上所示,在關鍵字func和名稱grow之間的那個圓括號及其包含的內容就是接收者宣告。其中的內容由兩部分組成。第一部分是代表它依附的那個型別的值的識別符號。第二部分是它依附的那個型別的名稱。後者表明了依附關係,而前者則使得在該方法中的**可以使用到該型別的值(也稱為當前值)
5.1特點:
5.2 機構體方法呼叫
p := person p.grow()
5.3 注意-接受型別
需要注意的是,在grow方法的接收者宣告中的那個型別是*person,而不是person。實際上,前者是後者的指標型別。這也使得person指代的是p的指標,而不是它本身。至於為什麼這麼做,我們在講指標的時候在予以揭曉。
5.4 結構體型別沒有繼承
包含若干欄位和方法的結構體型別就相當於乙個把屬性和操作封裝在一起的物件。不過要注意,與物件不同的是,結構體型別(以及任何型別)之間都不可能存在繼承關係。
實際上,在go語言中並沒有繼承的概念。不過,我們可以通過在結構體型別的宣告中新增匿名字段(或稱嵌入型別)來模仿繼承。具體細節可以參考《go併發程式設計實戰》中的說明,或者關注我的後續課程。
5.5 結構體型別屬於值型別,其零值 不是 nil 而是其中屬性的相應型別的零值。
舉個例子,結構體型別person的零值若用字面量來表示的話則為person{}
六、結構體指標
結構體指標
你可以定義指向結構體的指標類似於其他指標變數,格式如下:
var struct_pointer *books
struct_pointer = &book1;
使用結構體指標訪問結構體成員,使用 "." 操作符:
struct_pointer.title;
七、練習題
package main
import "fmt"
type person struct
oldaddress := p.move("san francisco")
fmt.printf("%s moved from %s to %s.\n", p.name, oldaddress, p.address)
資料型別之結構體
結構體是構造資料型別的一種 在c語言中,結構體是一種非常重要的資料型別。封裝多個不同型別的元素,作為互動的乙個介面 互動這塊,結構體變數可以作為資料結構中的乙個節點,可以作為網路通訊中傳送的訊息的封裝,可以作為核心中檔案屬性的封裝,可以作為驅動中對裝置檔案操作的封裝.也就是說,驅動,核心,應用方面都...
go 資料型別和型別轉換
數字型別包括整型和浮點型,內建的和系統無關的數字型別包括 和系統有關的型別有 組成每個字串的元素叫做 字元 可以通過遍歷或者單個獲取字串元素獲得字元 var a 中 var b x go 語言的字元有以下兩種 uint8型別,或者叫 byte 型,代表了ascii碼的乙個字元。rune型別,代表乙個...
Go 語言程式設計 高階資料型別 陣列
向函式傳遞陣列 指標陣列 陣列是具有相同資料型別的一組已編號且長度固定的資料項序列,可以是任意的原始資料型別也可以是自定義的資料型別。陣列元素可以通過索引 位置 來讀取 或者修改 索引從 0 開始,第乙個元素索引為 0,第二個索引為 1,以此類推。golang 陣列宣告需要指定元素型別及元素個數,使...