Golang学习笔记:struct-继承
在Golang中,可以使用struct来定义自定义类型。struct可以包含字段和方法,可以用于面向对象编程。本攻略将介如何在Golang中使用struct实现继承,包括嵌入式结构体和匿名字段。以下是Golang学习笔记struct-继的完整攻略:
1. 嵌入式结构体
嵌入式结构体是指在一个结构体中嵌入另一个结构体。嵌入式结构体可以实现继承的效果。以下是使用嵌入式结构体实现继承的步骤:
- 定义父结构体
首先,需要定义一个父结构体,包含一些字段和方法。,定义一个名为“Person”的结构体,包含“name”和“age”字段和“SayHello()”方法。
type Person struct {
name string
age int
}
func (p *Person) SayHello() {
fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.name, p.age)
}
`
2. 定义子结构体
然后,需要定义一个子结构体,嵌入父结构体。例如,定义一个名为“Student”的结构体,嵌入“Person”结构体,并添加一个“grade”字段。
```go
type Student struct {
Person
grade int
}
- 使用子结构体
现在,可以使用子结构体“Student”来访问父结构体“Person”的字段和方法。例如,创建一个名为“Tom”的学生,并调用“SayHello()”方法。
func main() {
tom := Student{
Person: Person{
name: "Tom",
age: 18,
},
grade: 12,
}
tom.SayHello()
}
输出结果为:
Hello, my name is Tom and I am 18 years old.
示例1:使用嵌入式结构体实现继承
假设需要定义一个名为“Animal”的结构体,包含“name”和“age”字段和“SayHello()”方法。然后,需要定义一个名为“Dog”的结构体,嵌入“Animal”结构体,并添加一个“breed”字段。可以按照以下步骤进行:
- 定义父结构体
type Animal struct {
name string
age int
}
func (a *Animal) SayHello() {
fmt.Printf("Hello, my name is %s and I am %d years old.\n", a.name, a.age)
}
- 定义子结构体
type Dog struct {
Animal
breed string
}
- 使用子结构体
func main() {
dog := Dog{
Animal: Animal{
name: "Buddy",
age: 3,
},
breed: "Golden Retriever",
}
dog.SayHello()
}
输出结果为:
Hello, my name is Buddy and I am 3 years old.
2. 匿名字段
匿名字段是指在一个结构体中定义一个没有名字的字段。匿名字段可以实现继承的效果。以下是使用匿名字段实现继承的步骤:
- 定义父结构体
首先,需要定义一个父结构体,包含一些字段和方法。例如,定义一个名为“Person”的结构体,包含“name”和“age”字段和“SayHello()”方法。
type Person struct {
name string
age int
}
func (p *Person) SayHello() {
fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.name, p.age)
}
- 定义子结构体
然后,需要定义一个子结构体,包含一个匿名字段,类型为父结构体。例如,定义一个名为“Student”的结构体,包含一个匿名字段,类型为“Person”结构体,并添加一个“grade”字段。
type Student struct {
Person
grade int
}
- 使用子结构体
现在,可以使用子结构体“Student”来访问父结构体“Person”的字段和方法。例如,创建一个名为“Tom”的学生,并调用“SayHello()”方法。
func main() {
tom := Student{
Person: Person{
name: "Tom",
age: 18,
},
grade: 12,
}
tom.SayHello()
}
输出结果为:
Hello, my name is Tom and I am 18 years old.
示例2:使用匿名字段实现继承
假设需要定义一个名为“Animal”的结构体,包含“name”和“age”字段和“SayHello()”方法。然后,需要定义一个名为“Dog”的结体,包含一个匿名字段,类型为“Animal”结构体,并添加一个“breed”字段。可以按照以下步骤进行:
- 定义父结构体
type Animal struct {
name string
age int
}
func (a *Animal) SayHello() {
fmt.Printf("Hello, my name is %s and I am %d years old.\n", a.name, a.age)
}
- 定义子结构体
type Dog struct {
Animal
breed string
}
- 使用子结构体
func main() {
dog := Dog{
Animal Animal{
name: "Buddy",
age: 3,
},
breed: "Golden Retriever",
}
dog.SayHello()
}
输出结果为:
Hello, my name is Buddy and I am 3 years old.
总的来说,使用嵌入式结构体和匿名字段都可以实现在Golang中实现继承的效果。需要注意的是,子结构体可以访问父结构体的字段和方法,但是父结体不能访问子结构体的字段和方法。