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