C語言中文網 目錄

Go語言內嵌結構體成員名字沖突

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

import (
    "fmt"
)

type A struct {
    a int
}

type B struct {
    a int
}

type C struct {
    A
    B
}

func main() {
    c := &C{}
    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 := &C{}
    c.a = 1
    fmt.Println(c)
}
此時再編譯運行,編譯器報錯:

.\main.go:22:3: ambiguous selector c.a

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

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

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo