埋め込み構造には同じメンバー名が付いている場合がありますが、メンバーの名前が同じ場合はどうなりますか?以下に例を挙げて説明します。

 

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 行目は、それぞれ int フィールドを持つ 2 つの構造体を定義しています。
  • 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

コンパイラは、セレクター a があいまいであること、つまり、C の A のフィールド a に 1 を割り当てるか、B のフィールド a に 1 を割り当てるかを決定できないことを C に伝えます。

埋め込み構造を使用する場合、Go 言語コンパイラーは非常に賢く、潜在的な曖昧さやエラーを警告します。

 

「 Go 言語の埋め込み構造体のメンバー名の競合」についてわかりやすく解説!絶対に観るべきベスト2動画

【Go言語 超入門コース】13.構造体|構造体ってなんだ? 異なるデータ型の変数を1つにまとめたもの【プログラミング初心者向け入門講座】
【セイト先生】Go言語使う企業が増えてるって本当!?Go言語を使う企業の特徴は??#エンジニア #プログラミング #Go

Share via
Copy link