1) この構造体は、ネストされた匿名構造体のすべてのフィールドとメソッドを使用できます。つまり、最初の文字が大文字または小文字のフィールドとメソッドが使用できます。
type A struct {
Name string
age int
}
func (a *A) SayName() {
fmt.Println("A say name", a.Name)
}
func (a *A) sayAge() {
fmt.Println("A say age", a.age)
}
type B struct {
sex string
A
}
func main() {
b := &B{
sex: "male",
A: A{
Name: "lucas",
age: 29,
},
}
b.SayName()
b.A.sayAge()
fmt.Println(b.Name)
fmt.Println(b.age)
}
2) 図に示すように、匿名構造体フィールドへのアクセスを簡素化できます。
上記のコードの要約
(1) b を介してフィールドまたはメソッドに直接アクセスする場合、実行プロセスは次のようになります。 b.Name
(2) コンパイラは、まず b に対応する型に Name があるかどうかを確認し、存在する場合は、型 B の Name フィールドを直接呼び出します。
(3) そうでない場合は、B に埋め込まれた匿名構造体 A に Name フィールドが宣言されているかどうかを確認します。宣言されている場合は、それを呼び出します。宣言されていない場合は、検索を続けます...見つからない場合は、エラーが報告されます ( if A にも埋め込み構造があるので呼び出すことができます)
(4)構造体と匿名構造体が同じフィールドやメソッドを持つ場合、コンパイラは最近接アクセス原則を使用してそれらにアクセスします。匿名構造体のフィールドやメソッドにアクセスしたい場合は、名前で区別できます。匿名構造。
type A struct {
Name string
age int
}
func (a *A) SayName() {
fmt.Println("A say name", a.Name)
}
func (a *A) sayAge() {
fmt.Println("A say age", a.age)
}
type B struct {
sex string
Name string
A
}
func (b *B) SayName() {
fmt.Println("B say name", b.Name)
}
func main() {
b := &B{
sex: "male",
Name: "jerry",
A: A{
Name: "lucas",
age: 29,
},
}
b.SayName()
fmt.Println(b.Name)
}
B say name jerry
jerry
B はフィールドを検索するときに独自のフィールド Name をすでに見つけているため、A の Name フィールドは検索しないことがわかります。
(5)構造体に 2 つ(以上)の匿名構造体が埋め込まれている場合、2 つの匿名構造体が同じフィールドとメソッドを持つ場合(構造体自体に同じ名前のフィールドとメソッドがない場合)、アクセス時に明示的に指定する必要があります。匿名の構造名。それ以外の場合はコンパイル エラーが報告されます。
type A struct {
Name string
age int
}
func (a *A) SayName() {
fmt.Println("A say name", a.Name)
}
type B struct {
Name string
sex string
}
func (b *B) SayName() {
fmt.Println("B say name", b.Name)
}
type C struct {
A
B
}
func main() {
c := &C{
A: A{
Name: "lucas",
age: 23,
},
B: B{
Name: "jerry",
sex: "male",
},
}
c.A.SayName()
fmt.Println(c.A.Name)
}
(6) 構造体が名前付き構造体をネストする場合、このパターンは組み合わせです。組み合わせ関係の場合、結合された構造体のフィールドまたはメソッドにアクセスするときに構造体の名前を取得する必要があります。
(7) 無名構造体をネストした後、構造体変数(インスタンス)作成時に各無名構造体フィールドの値を直接指定することもできます。
多重継承の説明
構造体が複数の匿名構造体をネストすると、構造体はネストされた匿名構造体のフィールドとメソッドに直接アクセスできるため、多重継承が実現します。
TV では Goods のプロパティとメソッドを使用できますが、Brand のプロパティとメソッドも使用できます。
複数の継承の詳細
1) 埋め込まれた匿名構造体が同じフィールド名またはメソッド名を持つ場合、アクセス時に匿名構造体の型名で区別する必要があります。
2) コードを単純にするために、多重継承を使用しないことをお勧めします。