6 7 Go語言內嵌結構體成員名字衝突

2021-10-06 15:17:16 字數 779 閱讀 1550

嵌入結構體內部可能擁有相同的成員名,成員重名時會發生什麼?下面通過例子來講解。

package main

import

("fmt"

)type a struct

type b struct

type c struct

func

main()

c.a.a =

1 fmt.

println

(c)}

**說明如下:

第 7 行和第 11 行分別定義了兩個擁有 a int 欄位的結構體。

第 15 行的結構體嵌入了 a 和 b 的結構體。

第 21 行例項化 c 結構體。

第 22 行按常規的方法,訪問嵌入結構體 a 中的 a 字段,並賦值 1。

第 23 行可以正常輸出例項化 c 結構體。

接著,將第 22 行修改為如下**:

func

main()

c.a =

1 fmt.

println

(c)}

此時再編譯執行,編譯器報錯:

.\main.go:

22:3: ambiguous selector c.a

編譯器告知 c 的選擇器 a 引起歧義,也就是說,編譯器無法決定將 1 賦給 c 中的 a 還是 b 裡的字段 a。

在使用內嵌結構體時,go語言的編譯器會非常智慧型地提醒我們可能發生的歧義和錯誤。

匿名欄位和內嵌結構體

結構體可以包含乙個或多個 匿名 或內嵌 字段,即這些字段沒有顯式的名字,只有欄位的型別是必須的,此時型別就是欄位的名字。匿名字段本身可以是乙個結構體型別,即 結構體可以包含內嵌結構體。可以粗略地將這個和物件導向語言中的繼承概念相比較,隨後將會看到它被用來模擬類似繼承的行為。go 語言中的繼承是通過內...

go語言結構體

go語言陣列可以儲存同一型別的資料 但在結構體中我們可以為不同項定義不同的資料型別 結構體是由一系列具有相同的型別或者不同型別的資料構成的資料集合 1.定義結構體 結構體定義需要使用type和struct語句。struct語句定義乙個新的資料型別,結構體中有乙個或者多個成員。type語句設定了結構體...

GO語言結構體

go語言的struct和c語言的很相似 簡單的struct定義 package main import fmt type test struct func main fmt.println a 或者 package main import fmt type test struct func main...