• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Go进阶嵌套struct的方法

武飞扬头像
嵌入式职场
帮助1

目录

(1)第一种方式

(2)第二种方式


(1)第一种方式

当内部struct嵌套进外部struct时,内部struct的方法也会被嵌套,也就是说外部struct拥有了内部struct的方法。

  1.  
    package main
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    )
  6.  
     
  7.  
    type person struct{}
  8.  
     
  9.  
    func (p *person) speak() {
  10.  
    fmt.Println("speak in person")
  11.  
    }
  12.  
     
  13.  
    // Admin exported
  14.  
    type Admin struct {
  15.  
    person
  16.  
    a int
  17.  
    }
  18.  
     
  19.  
    func main() {
  20.  
    a := new(Admin)
  21.  
    // 直接调用内部struct的方法
  22.  
    a.speak()
  23.  
    // 间接调用内部stuct的方法
  24.  
    a.person.speak()
  25.  
    }
学新通

当person被嵌套到Admin中后,Admin就拥有了person中的属性,包括方法speak()。所以,a.speak()a.person.speak()都是可行的。

如果Admin也有一个名为speak()的方法,那么Admin的speak()方法将掩盖内部struct的person的speak()方法。所以a.speak()调用的将是属于Admin的speak(),而a.preson.speak()将调用的是person的speak()。

示例演示:

  1.  
    package main
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    )
  6.  
     
  7.  
    type person struct{}
  8.  
     
  9.  
    func (p *person) speak() {
  10.  
    fmt.Println("speak in person")
  11.  
    }
  12.  
     
  13.  
    // Admin exported
  14.  
    type Admin struct {
  15.  
    person
  16.  
    a int
  17.  
    }
  18.  
     
  19.  
    func (a *Admin) speak() {
  20.  
    fmt.Println("speak in Admin")
  21.  
    }
  22.  
     
  23.  
    func main() {
  24.  
    a := new(Admin)
  25.  
    // 直接调用内部struct的方法
  26.  
    a.speak()
  27.  
    // 间接调用内部stuct的方法
  28.  
    a.person.speak()
  29.  
    }
学新通

(2)第二种方式

除了可以通过嵌套的方式获取内部struct的方法,还有一种方式可以获取另一个struct中的方法:将另一个struct作为外部struct的一个命名字段

  1.  
    type person struct {
  2.  
    name string
  3.  
    age int
  4.  
    }
  5.  
    type Admin struct {
  6.  
    people *person
  7.  
    salary int
  8.  
    }

现在Admin除了自己的salary属性,还指向一个person。这和struct嵌套不一样,struct嵌套是直接外部包含内部,而这种组合方式是一个struct指向另一个struct,从Admin可以追踪到其指向的person。所以,它更像是链表。

例如,person是Admin type中的一个字段,person有方法speak()。

  1.  
    package main
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    )
  6.  
     
  7.  
    type person struct {
  8.  
    name string
  9.  
    age int
  10.  
    }
  11.  
     
  12.  
    type Admin struct {
  13.  
    people *person
  14.  
    salary int
  15.  
    }
  16.  
     
  17.  
    func main() {
  18.  
    // 构建Admin实例
  19.  
    a := new(Admin)
  20.  
    a.salary = 2300
  21.  
    a.people = new(person)
  22.  
    a.people.name = "longshuai"
  23.  
    a.people.age = 23
  24.  
    // 或a := &Admin{&person{"longshuai",23},2300}
  25.  
     
  26.  
    // 调用属于person的方法speak()
  27.  
    a.people.speak()
  28.  
    }
  29.  
     
  30.  
    func (p *person) speak() {
  31.  
    fmt.Println("speak in person")
  32.  
    }
学新通

或者,定义一个属于Admin的方法,在此方法中应用person的方法:

  1.  
    func (a *Admin) sing(){
  2.  
    a.people.speak()
  3.  
    }

然后只需调用a.sing()就可以隐藏person的方法。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbhheh
系列文章
更多 icon
同类精品
更多 icon
继续加载