結構體可以包含乙個或多個匿名(或內嵌)字段,即這些字段沒有顯式的名字,只有欄位的型別是必須的,此時型別也就是欄位的名字。匿名字段本身可以是乙個結構體型別,即結構體可以包含內嵌結構體。
可以粗略地將這個和物件導向語言中的繼承概念相比較,隨後將會看到它被用來模擬類似繼承的行為。go語言中的繼承是通過內嵌或組合來實現的,所以可以說,在go語言中,相比較於繼承,組合更受青睞。
考慮如下的程式:
package main
import
"fmt"
type inners struct
type outers struct
func
main()
} fmt.
printf
("outer2 is:"
, outer2)
}
執行結果如下所示:
outer.b is:
6outer.c is:
7.500000
outer.
int is:
60outer.in1 is:
5outer.in2 is:
10outer2 is:
}
通過型別 outer.int 的名字來獲取儲存在匿名欄位中的資料,於是可以得出乙個結論:在乙個結構體中對於每一種資料型別只能有乙個匿名字段。
內嵌結構體
同樣地結構體也是一種資料型別,所以它也可以作為乙個匿名欄位來使用,如同上面例子中那樣。外層結構體通過 outer.in1 直接進入內層結構體的字段,內嵌結構體甚至可以來自其他包。內層結構體被簡單的插入或者內嵌進外層結構體。這個簡單的「繼承」機制提供了一種方式,使得可以從另外乙個或一些型別繼承部分或全部實現。
示例**如下所示:
package main
import
"fmt"
type a struct
type b struct
func
main()
,3.0
,4.0
} fmt.
println
(b.ax, b.ay, b.bx, b.by)
fmt.
println
(b.a)
}
輸出:
123
4
結構內嵌特性
go語言的結構體內嵌有如下特性。
1) 內嵌的結構體可以直接訪問其成員變數
嵌入結構體的成員,可以通過外部結構體的例項直接訪問。如果結構體有多層嵌入結構體,結構體例項訪問任意一級的嵌入結構體成員時都只用給出欄位名,而無須像傳統結構體欄位一樣,通過一層層的結構體欄位訪問到最終的字段。例如,ins.a.b.c的訪問可以簡化為ins.c。
2) 內嵌結構體的欄位名是它的型別名
內嵌結構體欄位仍然可以使用詳細的字段進行一層層訪問,內嵌結構體的欄位名就是它的型別名,**如下:
var c color
c.basiccolor.r =
1c.basiccolor.g =
1c.basiccolor.b =
0
乙個結構體只能嵌入乙個同型別的成員,無須擔心結構體重名和錯誤賦值的情況,編譯器在發現可能的賦值歧義時會報錯。 通過結構體內嵌組成型別
內嵌乙個t型別,那麼t的方法都被納入。內嵌允許構成複雜的型別,該型別由許多字段構成,每個字段提供一些方法。type wow struct func w wow string string type wow2 structw2 wow2 fmt.println w2 我是一代wow的方法 var s ...
關於C語言中的結構體內嵌函式
看門見山 1.內嵌函式定義舉例 經過真實測試 在函式中宣告定義結構體 include fun in struct.h int main int argc,char argv obj.word print obj.word printf d n obj.count print obj.count re...
Go語言 結構型別
認識一下go語言最簡單的程式結構。go語言的基礎組成有以下幾個部分。簡單 演示,輸出hello,go!package main import fmt func main 1.第一行 定義了包名 package main 2.import 代表匯入的包。此處匯入了 fmt包。3.func main 代...