6 5 Go語言型別內嵌和結構體內嵌

2021-10-06 14:26:58 字數 1743 閱讀 4456

結構體可以包含乙個或多個匿名(或內嵌)字段,即這些字段沒有顯式的名字,只有欄位的型別是必須的,此時型別也就是欄位的名字。匿名字段本身可以是乙個結構體型別,即結構體可以包含內嵌結構體。

可以粗略地將這個和物件導向語言中的繼承概念相比較,隨後將會看到它被用來模擬類似繼承的行為。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 代...