广告位联系
返回顶部
分享到

Golang中实现类似类与继承的方法

Golang 来源:互联网 作者:佚名 发布时间:2024-04-24 22:19:09 人浏览
摘要

在Go语言中,并没有像传统面向对象编程语言(Java、C++)中那样的类和继承的概念。Go语言采用了结构体和组合的方式来实现类似的功能。 在Go语言中,可以通过结构体嵌套来实现类似父类与子

在Go语言中,并没有像传统面向对象编程语言(Java、C++)中那样的类和继承的概念。Go语言采用了结构体和组合的方式来实现类似的功能。
在Go语言中,可以通过结构体嵌套来实现类似父类与子类的关系。当一个结构体嵌套了另一个结构体时,外层的结构体可以访问其嵌套结构体的字段和方法,这种方式被称为组合。Go语言中通过方法接受者的类型来决定方法的归属和继承关系。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package main

import "fmt"

// 父类

type Parent struct {

    name string

}

// 父类的方法

func (p *Parent) SayHello() {

    fmt.Println("Hello, I'm", p.name)

}

// 子类

type Child struct {

    Parent // 嵌入父类

    age    int

}

func main() {

    // 创建子类对象

    c := &Child{

        Parent: Parent{name: "John"},

        age:    10,

    }

    // 调用父类的方法

    c.SayHello()

    // 访问父类的字段

    fmt.Println("Parent name:", c.name)

    // 访问子类的字段

    fmt.Println("Child age:", c.age)

}

输出结果:

Hello, I'm John
Parent name: John
Child age: 10

二、接口的使用

Go语言可以在接口(interface)中声明一个方法但没有具体实现。接口在Go中是一种定义行为的类型,它允许你声明一个方法签名(方法名称、输出参数和返回值),而不需要实现这个方法。任何类型都可以实现这个接口,只要它提供了与接口声明中相同名称、相同签名的方法。

示例代码,父类的方法中使用了子类的方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

package main

import "fmt"

// 定义一个接口,包含子类想要实现的方法

type BMethod interface {

    B()

}

// 父类

type Parent struct{}

// 父类的方法,接受一个实现了BMethod接口的参数

func (p *Parent) A(b BMethod) {

    fmt.Println("Parent's A method")

    b.B() // 调用传入的B方法

}

// 子类

type Child struct {

    *Parent // 嵌入父类,虽然在这个例子中嵌入并没有实际作用,因为Parent没有数据字段

}

// 子类实现BMethod接口的B方法

func (c *Child) B() {

    fmt.Println("Child's B method")

}

func main() {

    child := &Child{}

    child.A(child) // 显式地将child作为参数传递给A方法

}

在Go语言中,一个结构体可以实现一个或多个接口。当结构体定义了与接口中声明的方法签名相匹配的方法时,我们就说该结构体实现了该接口。这并不需求显式地声明结构体实现了某个接口,而是通过实现接口中的方法来隐式地完成。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package main

import "fmt"

// 定义一个接口

type Shape interface {

    Area() float64

}

// 定义一个结构体

type Rectangle struct {

    width  float64

    height float64

}

// 为Rectangle结构体实现Area方法

func (r Rectangle) Area() float64 {

    return r.width * r.height

}

func main() {

    // 创建一个Rectangle对象

    rect := Rectangle{width: 10, height: 5}

    // 调用Area方法

    fmt.Println("Rectangle area:", rect.Area())

    // 隐式地将Rectangle对象赋值给Shape接口变量

    var s Shape

    s = rect

    // 通过接口变量调用Area方法

    fmt.Println("Shape area:", s.Area())

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Golang图片验证码的使用方法介绍

    Golang图片验证码的使用方法介绍
    一、背景 最近在使用到Golang进行原生开发,注册和登录页面都涉及到图片验证码的功能。找了下第三方库的一些实现,发现了这个库用得还
  • Golang中实现类似类与继承的方法
    在Go语言中,并没有像传统面向对象编程语言(Java、C++)中那样的类和继承的概念。Go语言采用了结构体和组合的方式来实现类似的功能。
  • Golang中四种gRPC模式举例介绍
    1. Unary RPC proto文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 syntax = proto3; option go_package=.;service; message HelloRequest { // Name of the person to greet string n
  • go-python库使用应用介绍
    在当今软件开发领域,跨语言编程已经成为一种常见的需求。不同的编程语言各自有其优势和适用场景,因此在项目开发过程中,经常需要
  • Go json反序列化“null“的问题解决

    Go json反序列化“null“的问题解决
    有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map
  • 在golang中将“2023年4月”解析为time.Time对象的详细
    我无法将像April 2023这样的日期字符串解析为 time.Time 对象来比较 golang 中的日期时间对象。 正确答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main
  • 在golang中,我可以使用flag包来定义一个可以选择
    我想做的是能够运行这三个场景: cmd --test --branchrelease cmd --测试全部 --branch release cmd --分支发布 能够在没有参数(如布尔值)的情况下自行
  • Docker golang + ffmpeg执行命令失败
    您好,我正在使用以下 docker 映像: 1 from golang:alpine3.18 使用 ffmpeg:(可能在这里我遗漏了一些东西) 1 run apk add --no-cache ffmpeg 但是当尝试执
  • 如何使用beego orm在postgres中存储图片
    Postgres如何存储文件 postgres提供了两种不同的方式存储二进制,要么是使用bytea类型直接存储二进制,要么就是使用postgres的LargeObject功能;决
  • GoLang sync.Pool简介与用法
    一句话总结:保存和复用临时对象,减少内存分配,降低GC压力 sync.Pool是可伸缩的,也是并发安全的,其大小仅受限于内存大小。sync.Pool用
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计