package main
import "fmt"
type testA struct {
Name string
age int
}
func (testa *testA) SayOk() {
fmt.Println("testA Sayok", testa.Name)
}
func (testa *testA) sayHello() {
fmt.Println("testA sayhello", testa.Name)
}
//结构体可以使用嵌套匿名结构体所有的字段和方法
//首字母大小写的字段方法都可以使用
type testB struct {
testA
Name string
}
func (testb *testB) SayOk() {
fmt.Println("testB SayOk", testb.Name)
}
func main() {
// var testb testB
// testb.testA.Name = "tom"
// //匿名结构体字段访问可以简化
// testb.age = 10
// testb.sayHello()//testA sayhello tom
// testb.SayOk()//testB SayOk
// fmt.Println(testb)//tom 10
//当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问
//如果希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分
var b testB
b.Name = "jack"
b.testA.Name = "scott" //指定testA则给testA赋值
b.age = 100
b.sayHello() //testA sayhello scott
b.SayOk() //testB SayOk jack
}
package main
import "fmt"
/*
结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法时
(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错
*/
type A struct {
Name string
age int
}
type B struct {
Name string
Score float64
}
type C struct {
A
B
}
//如果一个struct嵌套了一个有名结构体,这种模式就是组合
type D struct {
a A
b B
}
type Goods struct {
Name string
Price float64
}
type Brand struct {
Name string
Address string
}
type TV struct {
Goods
Brand
}
type TV2 struct {
*Goods
*Brand
}
func main() {
var c C
//此处C没有Name字段,而A和B都有Name,这时必须通过指定匿名结构体名来区分
c.A.Name = "tom"
//age为A独有,因此不必指定
c.age = 80
var d D
//如果是组合关系,那么在访问组合的结构体字段或者方法时,必须带上结构体名字
d.a.Name = "jack"
d.b.Name = "mary"
//d.Name 报错
//嵌套匿名结构体后,也可以在创建结构体变量时,直接指定各个匿名结构体字段的值
tv := TV{Goods{"电视机", 5000.00}, Brand{"海尔", "山东"}}
tv2 := TV{
Goods{
Price: 10000.00,
Name: "液晶电视机",
},
Brand{
Name: "华为",
Address: "北京",
},
}
fmt.Println(tv)
fmt.Println(tv2)
tv3 := &TV{
Goods{
Price: 15000.00,
Name: "悬浮投影仪",
},
Brand{
Name: "华为",
Address: "北京",
},
}
fmt.Println("tv3", *tv3)
}