Go 继承,结构体实现继承

demo.go(结构体的匿名字段实现继承):

package main

import "fmt"

// 定义结构体类型 (父类)
type Person struct {
	id   int
	name string
	age  int
}

// 定义结构体类型 (子类)
type Student struct {
	Person // 匿名字段实现继承 (结构体嵌套结构体)
	//p Person  // 也可以为结构体Person起别名
	score int
}

func main() {
	// 对象
	var stu Student
	//stu.Person.name = "张三"  // 可以通过Person.的方式获取/修改父类的属性
	stu.name = "张三" // 也可以直接通过.的方式获取/修改父类的属性
	//stu.p.name = "张三"  // 如果不是通过匿名字段实现的继承而是别名,那么必须通过别名p.的方式获取父类属性
	stu.age = 20     // 继承于父类的属性
	stu.score = 90   // 子类本身的属性
	fmt.Println(stu) // {{0 张三 20} 90}

	// 对象
	var stu2 Student = Student{Person{2, "李四", 22}, 95}
	fmt.Println(stu2)  // {{2 李四 22} 95}
}

demo.go(子类结构体中存在和父类相同的成员):

package main

import "fmt"

// 定义结构体类型 (父类)
type Person struct {
	id   int
	name string
	age  int
}

// 定义结构体类型 (子类)
type Student struct {
	Person       // 匿名字段实现继承 (结构体嵌套结构体)
	name  string // 和父类Person中重复的成员。
	score int
}

func main() {
	// 对象
	var stu Student
	stu.name = "张三"  // 默认赋值给子类的name成员,父类的name成员默认是空串。
	stu.Person.name = "小张"  // 赋值给父类的name成员
	stu.age = 20
	stu.score = 90
	fmt.Println(stu)  // {{0 小张 20} 张三 90}
}

demo.go(结构体的匿名字段是指针,实现继承):

package main

import "fmt"

// 定义结构体类型 (父类)
type Person struct {
	id   int
	name string
	age  int
}

// 定义结构体类型 (子类)
type Student struct {
	*Person     // 指针实现继承 (结构体指针)
	score int
}

func main() {
	// 对象
	var stu Student
	// stu.name = "张三"  // 会报错。 通过指针实现继承,不能为父类成员直接赋值,需要先new()开辟空间
	stu.Person = new(Person)  // stu.Person是指针类型,默认是空指针nil。 需要先new()开辟空间。
	stu.name = "张三"  // new()开辟空间之后,才可以为父类的成员赋值。  (*stu.Person).父类成员 可以简写成 stu.父类成员
	// stu.Person = &Person{2, "张三", 20}  // 也可以通过该方式直接为父类成员赋值。
	stu.age = 20
	stu.score = 90
	fmt.Println(stu)  // {0xc000004460 90}
}

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/88691605
今日推荐