Go中struct结构体实现继承

  • Post author:
  • Post category:其他




Go中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()
}

当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()。

验证如下:

func (a *Admin) speak() {
	fmt.Println("speak in Admin")
}

func main() {
	a := new(Admin)
	// 直接调用内部struct的方法
	a.speak() 
	// 间接调用内部stuct的方法
	a.person.speak()
}

输出结果为:

speak in Admin

speak in person

  • 第二种 指针 指向相当struct 于链表
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")
}



版权声明:本文为weixin_43895671原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。