目录


当内部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()