GO學習筆記 組合(18)

2021-08-30 17:35:11 字數 1445 閱讀 6480

go只支援封裝,不支援繼承,那麼如果我們想要對其他包上的一些型別進行擴充套件,比如說在原有結構體上加上一些自己的東西,c++中可以用繼承實現,但是go沒有,所以go引入了組合,用組合來實現繼承的功能,同樣起到**復用的效果。

如果我們想在本包中使用別的包中的型別,但又不想使用它的名字,使用別名就可以搞定。

如果想要在本包中使用別的包中的型別,同時想在此基礎上,新增一些功能和內容,就可以使用組合,下面來講組合。

這邊為了方便演示,就在同乙個包中演示了。

//父結構體,表示人

type person struct

//子結構體,繼承父類的屬性,同時還有別的屬性

type student struct

func main() ,class:"計本154",sno:"12345678"}

fmt.println(a.name)

}

輸出結果

pigff
如上**,定義了乙個person結構體表示人,它有字段name和age,再定義了乙個student結構體,它裡面有乙個匿名字段,該欄位型別是person(該欄位名預設和型別名一樣,這一點可以在main函式的賦值語句看到),還有自己的字段class和sno。這樣的結構體型別就起到了繼承的效果,student結構體繼承了person結構體的所有欄位name和age,因為我們將該字段定義成了匿名字段,因此,我們可以直接列印 (a.name),直接訪問到person結構體中的字段

如果不定義成匿名欄位會怎樣,來上**

//父結構體,表示人

type person struct

//子結構體,繼承父類的屬性,同時還有別的屬性

type student struct

func main() ,class:"計本154",sno:"12345678"}

fmt.println(a.name)

}

我們在student結構體中定義了乙個person型別的變數的basic,因此我們下面在賦值的時候也是用的basic。但是這樣的程式會出錯

.\main.go:21:15: a.name undefined (type student has no field or method name)
a中沒有欄位名叫name,也就是說,我們不能直接訪問我們繼承下來的父結構體的字段。

所以,如果想要訪問原有型別的字段,那麼就需要在結構體中將該型別定義成匿名字段(通常都是定義成匿名欄位的)。

這兩個結構體不是繼承的關係,是組合,但是它起到了繼承的效果,也有繼承最關鍵的作用——**復用。

另外還要說一點:如果要組合的原型別很大,那麼在組合型別中最好將該字段定義成指標型別,這樣可以節省空間。

Go學習筆記

使用關鍵字var定義變數,自動初始化為零值。如果提供初始化值,可省略變數型別。在函式內部,可用更簡略的 方式定義變數。空白符號 package main import fmt func test 2,0 函式內部 定義變數陣列data 0 data 1 data 2 並賦值0,1,2,且i 0 i,...

go學習筆記

那些打不倒你的,終將讓你變的更強 package main import fmt func main 輸出結果 num1的型別是 int,數值是 30 num2的型別是 int,數值是 40 name的型別是 string,數值是 zhangshang sum的型別是 int,數值是 30 1 2 ...

Go學習筆記

go語言型別宣告語句 一 宣告變數 var 基本資料型別 1.整型 基礎型別 變數的宣告 變數的字面值為整型 var a int 自動初始化為0 變數的賦值 a 100 var b 200 隱式宣告變數並初始化 var c int 300 顯式宣告型別的變數 d 400 自動推導變數的型別 w,z ...