0

0

golang怎么继承

王林

王林

发布时间:2023-05-22 15:25:07

|

853人浏览过

|

来源于php中文网

原创

在go语言中,没有传统面向对象语言中所定义的“类”,因此不存在所谓的“继承”。但是,go语言提供了一种通过组合实现类似继承的方法,叫做嵌入(embedding)。

嵌入可以让我们将一个类型嵌入到另一个类型中,这样被嵌入的类型就可以直接访问嵌入它的类型的属性和方法,而无需通过接口或者其他方式来访问。这个过程类似于传统的“继承”,但是更加灵活。

下面,我们将通过几个例子来演示如何使用嵌入实现类似继承的功能。

  1. 基础例子

我们先定义几个基础的结构体,狗、猫和人:

type Dog struct {
    name string
}

func (d Dog) Bark() {
    fmt.Println(d.name, ": 汪汪汪!")
}

type Cat struct {
    name string
}

func (c Cat) Mew() {
    fmt.Println(c.name, ": 喵喵喵!")
}

type Person struct {
    name string
}

func (p Person) Speak() {
    fmt.Println(p.name, ": 你好!")
}

现在我们要创建一种动物类型,它可以“继承”狗和猫,并且还有自己的属性和方法,比如颜色和奔跑的速度。我们可以这样来定义:

立即学习go语言免费学习笔记(深入)”;

type Animal struct {
    Dog
    Cat
    color       string
    runSpeed    int
}

func (a Animal) Run() {
    fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!")
}

在这个定义中,Animal类型嵌入了Dog和Cat类型。这意味着Animal类型实例化的对象可以直接访问Dog和Cat类型的属性和方法。我们也可以给Animal类型定义自己的属性和方法,比如color和runSpeed,用来表示动物的颜色和奔跑的速度,并且定义一个Run方法来描述动物的奔跑动作。

现在我们来创建一个Animal对象,看看它是如何工作的:

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    a.Bark()    // 小黑 : 汪汪汪!
    a.Mew()     // 小白 : 喵喵喵!
    a.Run()     // 黑白相间 的动物以 50 km/h的速度奔跑!
}

我们可以看到,通过嵌入Dog和Cat类型,Animal对象可以直接调用Bark和Mew方法,而无需使用接口或其他方式。这种方式可以让我们在不使用传统意义上的“继承”情况下实现类似的功能。

  1. 嵌入自定义类型

我们可以将一个自定义类型嵌入到另一个自定义类型中,实现类似继承的效果。现在,我们来定义一个Person类型和一个Student类型,并将Person类型嵌入到Student类型中:

type Person struct {
    name string
    age  int
    sex  string
}

type Student struct {
    Person
    class string
    score float64
}

在这个定义中,Student类型嵌入了Person类型。实例化Student类型对象的时候,可以使用Person的属性和方法。比如,我们可以实例化一个学生对象,设置他的姓名、年龄、性别、班级和成绩:

美图AI开放平台
美图AI开放平台

美图推出的AI人脸图像处理平台

下载
func main() {
    s := Student{
        Person: Person{
            name: "小明",
            age:  18,
            sex:  "男",
        },
        class: "高三一班",
        score: 92.5,
    }
    fmt.Println("姓名:", s.name)
    fmt.Println("年龄:", s.age)
    fmt.Println("性别:", s.sex)
    fmt.Println("班级:", s.class)
    fmt.Println("成绩:", s.score)
}

当我们运行这个程序时,可以看到输出如下:

姓名: 小明
年龄: 18
性别: 男
班级: 高三一班
成绩: 92.5

我们可以看到,Student对象可以直接访问Person类型对象的属性和方法,包括name、age和sex等属性。

  1. 嵌套嵌入

在一个类型中嵌套多个类型也是可以的。我们可以将Animal类型嵌入到另一个类型中,来实现更多的功能。比如,我们现在来定义一个Zoo类型:

type Zoo struct {
    Animal
    name    string
    address string
}

func (z Zoo) ShowInfo() {
    fmt.Println("这是", z.name, ", 地址是", z.address)
    z.Run()
}

在这个类型的定义中,我们将Animal类型嵌入到Zoo类型中。这样,Zoo类型可以直接访问Animal类型的属性和方法,包括Run方法。我们再定义一个ShowInfo方法来输出动物园的名称和地址,并且调用Animal类型的Run方法来展示动物们的奔跑。

现在,我们创建一个动物园对象,并测试它的方法:

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"}
    z.ShowInfo()
}

当我们运行这个程序时,可以看到输出如下:

这是 北京动物园 , 地址是 北京市海淀区清华科技园路
黑白相间 的动物以 50 km/h的速度奔跑!

我们可以看到,通过将Animal类型嵌套到Zoo类型中,我们可以创建出具有更多功能的类型,可以展示动物园的信息和动物们的奔跑动作。

总结

虽然在Go语言中没有传统面向对象语言所定义的类和继承的概念,但是嵌入的概念可以让我们在不使用传统的继承方式的情况下,实现类似的功能,更加灵活和方便。通过以上的例子,我们可以看到,嵌入可以轻松创建一个包含子类型的类型,并且可以方便地调用它们的方法和属性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号