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