golang中的类和接口

在 Go 语言中并没有类的概念,而是使用结构体来实现面向对象的特性。通过 type 关键字可以定义自定义类型,包括结构体类型。下面是一个简单的示例:

package mainimport "fmt"// 定义一个结构体类型
type Person struct {Name stringAge  int
}// 定义结构体方法,类似于类的成员方法
func (p Person) SayHello() {fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.Name, p.Age)
}func main() {// 创建一个结构体对象person := Person{Name: "Alice", Age: 30}// 调用结构体方法person.SayHello()
}

在这个示例中,我们使用 type 关键字定义了一个名为 Person 的结构体类型,它包含了 NameAge 两个字段。然后,我们定义了一个结构体方法 SayHello(),它用于输出该结构体对象的信息。在 main() 函数中,我们创建了一个 Person 类型的对象,并调用了 SayHello() 方法。

尽管 Go 中没有类的概念,但结构体类型可以包含字段和方法,从而实现面向对象编程的特性。结构体的方法可以在函数名前加上接收者参数,通过这种方式,结构体类型可以拥有类似于类的方法。

面向过程到面向对象

pulsar 生产者

下面是一个结构化的生产者方法

// 生产者
func Producer(ip string, port int8, topic string)  {client, err := pulsar.NewClient(pulsar.ClientOptions{URL: "pulsar://192.168.1.10:6650",})defer client.Close()producer, err := client.CreateProducer(pulsar.ProducerOptions{Topic: "demo123567",})for{_, err = producer.Send(context.Background(), &pulsar.ProducerMessage{Payload: []byte("hello"),})defer producer.Close()if err != nil {fmt.Println("Failed to publish message", err)} else {fmt.Println("Published message")}time.Sleep(1 * time.Second)}
}

改造成面向对象的结构体方法为:

package pulsartoolsimport ("context""fmt""github.com/apache/pulsar-client-go/pulsar"
)// Producer 结构体定义
type Producer struct {client   pulsar.Clientproducer pulsar.Producer
}// NewProducer 初始化生产者对象
func NewProducer(ip string, port int, topic string) (*Producer, error) {client, err := pulsar.NewClient(pulsar.ClientOptions{URL: fmt.Sprintf("pulsar://%s:%d", ip, port),})if err != nil {return nil, err}producer, err := client.CreateProducer(pulsar.ProducerOptions{Topic: topic,})if err != nil {return nil, err}return &Producer{client:   client,producer: producer,}, nil
}// Send 发送消息
func (p *Producer) Send(msg string) error {_, err := p.producer.Send(context.Background(), &pulsar.ProducerMessage{Payload: []byte(msg),})if err != nil {fmt.Println("Failed to publish message", err)} else {fmt.Println("Published message")}return err
}// Close 关闭生产者
func (p *Producer) Close() {p.producer.Close()p.client.Close()
}

这段代码将原来的生产者函数改造为了一个名为 Producer 的结构体类型,并定义了三个方法:NewProducerSendClose

  • NewProducer 方法用于初始化生产者对象。它接收 IP 地址、端口和主题作为参数,创建一个 Pulsar 客户端,并使用客户端创建一个生产者对象。如果初始化过程中出现错误,则返回 nil 和错误信息。

  • Send 方法用于发送消息。它接收一个消息字符串作为参数,并通过生产者对象发送消息到指定的主题。如果发送过程中出现错误,则输出错误信息;否则输出消息发送成功的提示。

  • Close 方法用于关闭生产者对象。它先关闭生产者,然后关闭 Pulsar 客户端。

这样改造后,生产者的功能被封装在了一个结构体类型中,使得代码更加模块化和可维护。通过调用结构体的方法来使用生产者对象,使得代码更加直观和易于理解。

接口

在 Go 语言中,接口是一种抽象类型,它定义了对象的行为。接口类型是由一组方法定义的集合,一个对象只要实现了接口中定义的所有方法,就被认为是实现了该接口。

接口的定义使用 type 关键字,接口中的方法没有实现,只有方法签名,类似于其他语言中的抽象方法。任何类型只要拥有接口中定义的全部方法,即使未显式声明实现了该接口,也被视为实现了该接口。

接口的声明格式为

type InterfaceName interface {Method1() ReturnType1Method2(arg Type) ReturnType2// 更多方法...
}

其中 InterfaceName 是接口的名称,Method1Method2 等是接口的方法,ReturnType1ReturnType2 是方法的返回类型,Type 是方法参数的类型。
下面是一个简单的接口示例

package main
import "fmt"
// 定义一个接口
type Animal interface {Speak() string
}
// 定义一个结构体类型
type Dog struct{}
// Dog 结构体类型实现了 Animal 接口的 Speak 方法
func (d Dog) Speak() string {return "Woof!"
}
// main 函数
func main() {// 创建一个 Dog 对象dog := Dog{}// 将 Dog 对象赋值给 Animal 接口var animal Animal = dog// 调用接口方法fmt.Println(animal.Speak()) // Output
Woof!
}

在这个示例中,我们定义了一个 Animal 接口,它包含一个 Speak 方法。然后我们定义了一个 Dog 结构体类型,并为它实现了 Speak 方法。在 main 函数中,我们创建了一个 Dog 对象,并将其赋值给 Animal 接口。通过接口,我们可以调用 Speak 方法来执行相应的行为。

接口的使用使得代码更加灵活和可扩展,可以让不同的类型通过实现相同的接口来实现多态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

只对外公开必要的信息和步骤

隐藏内部结构 使对象的内部结构对外部不可见的内容的处理被称为封装化。只公开方法等使用者所需要的最低限度的接口,使用者只能通过外部接口进行访问。如此一来,使用该类的程序就无须知道其内部的具体实现。 通过封装化,不仅可以防止调用者…

Node.js安装及环境配置(超详细!保姆级!!)

目录 一、进入官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 一、进入官网地址下载安装包 Node.js — Download Node.js (nodejs.org) 选择对应你系统的 node.js 版本,我选择的是Windows系统,64位 点击图中选项&#…

无人机+应急通信:灾害现场应急通信车技术详解

无人机和应急通信车是灾害现场应急通信中的重要技术。无人机可以通过快速到达灾害现场,搭载高清摄像头、红外热成像仪、激光雷达等设备,对灾区进行实时监测和灾情评估,同时也可以通过搭载的通信设备,与指挥中心进行实时通信和数据…

APP逆向实现方式总览

方式一:硬核分析 梳理出参数的构造逻辑,代码还原算法 方式二:模拟执行 2.1 Frida-RPC 电脑调用已加载到手机内存中的方法,直接获取到结果 2.2 AndServer-RPC 安卓程序调用手机中的方法,最后暴露成HTTP服务供电脑…

✅什么是排他锁、共享锁、意向锁

共享锁 共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。 一旦事务…

202009青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 通过算式123122021120可将二进制1101 转为十进制,下列进制转换结果正确的是?( ) A :0b10转为十进制,结果是2 B :0d10转为十进制,结果是8 C :0x10转为十进制,结果是10 D :0o10转为十进制,结果是16 正确答案:A 试题解析: 第 2 题 【单选题】 语句flo…

基于Nios-II实现流水灯

文章目录 一、新建项目1、选择芯片2、Qsys设计2.1、点击Platform Designer2.2配置软核2.3其他设置 3、Quartus设计3.1添加原理图3.2添加qip文件3.3其他设置3.4驱动设置 4、Nios-II Eslipse设计参考 一、新建项目 使用的Quartus 18.0及以上版本 1、选择芯片 2、Qsys设计 2.1、点…

【AIGC调研系列】你好-GPT-4o

GPT-4o是OpenAI最新发布的一款人工智能模型,它具备处理和生成文本、音频和图像的能力。这个模型的特点是能够实时对这些不同类型的输入进行推理和响应,这使得它在多模态交互方面表现出色[1][2][3]。 GPT-4o的“o”代表“omni”,意味着它是一…

【复试分数线】综合性985历年分数线汇总(第四弹)

国家线和34所自划线 可以看作是考研上岸最最最基础的门槛。真正决定你能不能进入复试的还要看院线(复试分数线)!今天我将分析考信号的除C9、工科类985的其他7所985近三年复试分数线(不包括2024),大家可以参…

Azure IoT Hub是啥

1.概要说明 Azure IoT Hub是微软在物联网(IoT)领域提供的一款重要产品,为设备连接和管理提供了专业的解决方案。以下是关于Azure IoT Hub的详细介绍: 定义:Azure IoT Hub是一个专为连接和管理数百万台物联网设备而设计…

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候,需要检测到人脸再进行后续的操作,这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

如何按住ctrl滑动鼠标桌面图标大小不变

如何按住ctrl滑动鼠标桌面图标大小不变 采取以下步骤: 1、鼠标在电脑桌面空白处单击右键,然后在弹出的对话框最上面有个“查看”,点击“查看”出来的最上面有“大图标”“中等图标”“小图标”,根据自己的需要选择图标大小即可。…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作,本章我们针对增删查改内容进行与一些拓展, 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为: create table 表名 ( 字段名1 字段数据类型(数据类型长度), 字段名2 …

Pytorch学习-调整torchvision.models中模型输出类别数

假设你的类别只有10个,而torchvision.models中Vgg16的输出类别为1000,这时应该如何调整呢? 方法一,直接修改模型中类别的输出。 from torch.nn import Linear import torchvision import torchVgg16torchvision.models.vgg16(pre…

华为认证大数据是什么?华为认证大数据有用吗?

华为大数据是用来搜集整理大数据,提供解决方案的数据中心。华为大数据解决方案是华为公司推出的一种综合性云解决方案,主要针对广告营销、电商、车联网等大数据应用场景的云计算大数据方案,帮助企业用户构建大数据平台,解决企业的…

GRE over IPsec VPN实验

一、拓扑图 二、组网需求 某企业总部、分支1、分支2分别通过 R1,R3,R4 接入互联网,配置默认路由连通公网按照图示配置 IP 地址,R1,R3,R4 分别配置 Loopback0 口匹配感兴趣流,Loopback1 口模拟业…

GPIO输出速度(ARM-GD32)

单片机输出速度对GPIO硬件的影响 如果T为100ns 那么2/3*100ns 67ns 那么tr tf 38 ns (也就是不能超过32ns) tr 和tf和什么东西有关如何去控制 CL 是一个电容,电容会改变和影响电压变化的速率,输出高低电平也就是对电容进行充电…

【噪声学习】SELFIE:更新不干净样本的鲁棒性深度学习

SELFIE: Refurbishing Unclean Samples for Robust Deep Learning 摘要: 由于深度神经网络具有极高的表达能力,其副作用是即使在标签噪声极高的情况下也能完全记住训练数据。为了克服对噪声标签的过度拟合,我们提出了一种名为 SELFIE 的新型鲁棒训练方法。我们的主要想法是…

俄罗斯方块【python,小游戏】

俄罗斯方块(Tetris)是一款经典的俄罗斯益智游戏,游戏的核心玩法是通过移动、旋转和放置不同形状的方块,使它们在游戏界面的底部形成完整的水平线。一旦水平线填满,就会被清除,为新的方块腾出空间。 在 Pyt…

Python GUI开发- PyQt5 开发小工具环境入门

前言 常见的python开发gui的库有 Tkinter, PyQt5, wxPython等。本教程是选择PyQt5 开发桌面小工具。 环境准备 只需pip安装即可快速准备好开发环境 pip install pyqt5快速开始 创建一个空的window窗口 Qapplication():每个GUI都必须包含…