golang继承的一些细节

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)
}

  

posted @ 2022-03-10 11:19  Star_Gazer  阅读(34)  评论(0编辑  收藏  举报