目录
当内部struct嵌套进外部struct时,内部struct的方法也会被嵌套,也就是说外部struct拥有了内部struct的方法。
package main
import (
"fmt"
)
type person struct{}
func (p *person) speak() {
fmt.Println("speak in person")
}
// Admin exported
type Admin struct {
person
a int
}
func main() {
a := new(Admin)
// 直接调用内部struct的方法
a.speak()
// 间接调用内部stuct的方法
a.person.speak()
}
a.speak()a.person.speak()
a.speak()a.preson.speak()
示例演示:
package main
import (
"fmt"
)
type person struct{}
func (p *person) speak() {
fmt.Println("speak in person")
}
// Admin exported
type Admin struct {
person
a int
}
func (a *Admin) speak() {
fmt.Println("speak in Admin")
}
func main() {
a := new(Admin)
// 直接调用内部struct的方法
a.speak()
// 间接调用内部stuct的方法
a.person.speak()
}
除了可以通过嵌套的方式获取内部struct的方法,还有一种方式可以获取另一个struct中的方法:将另一个struct作为外部struct的一个命名字段。
type person struct {
name string
age int
}
type Admin struct {
people *person
salary int
}
现在Admin除了自己的salary属性,还指向一个person。这和struct嵌套不一样,struct嵌套是直接外部包含内部,而这种组合方式是一个struct指向另一个struct,从Admin可以追踪到其指向的person。所以,它更像是链表。
例如,person是Admin type中的一个字段,person有方法speak()。
package main
import (
"fmt"
)
type person struct {
name string
age int
}
type Admin struct {
people *person
salary int
}
func main() {
// 构建Admin实例
a := new(Admin)
a.salary = 2300
a.people = new(person)
a.people.name = "longshuai"
a.people.age = 23
// 或a := &Admin{&person{"longshuai",23},2300}
// 调用属于person的方法speak()
a.people.speak()
}
func (p *person) speak() {
fmt.Println("speak in person")
}
或者,定义一个属于Admin的方法,在此方法中应用person的方法:
func (a *Admin) sing(){
a.people.speak()
}
a.sing()