Go语言中的接收器(Receiver)详解

在 Go 语言中,接收器(Receiver) 是指在方法声明中与方法绑定的对象。它是 Go 语言实现面向对象编程(OOP)特性的核心之一。接收器的作用是将方法绑定到某个类型的实例(值或者指针),让该类型的实例能够调用方法。

1. 什么是接收器?

接收器是方法的一部分,它标识了方法所属的类型(即哪个类型能够调用这个方法)。接收器出现在方法的参数列表的第一个位置,在语法上类似于函数的参数,但它表示的是方法的调用对象。

接收器的作用是使得方法与特定类型的对象(实例)关联,类似于其他编程语言中的类(class)中的成员函数(member function)或实例方法(instance method)。

2. 接收器的位置与语法

接收器的声明位于方法的参数列表的前面,格式如下:

func (receiverType ReceiverType) MethodName(parameters) returnType {
    // 方法体
}
  • receiverType:表示接收器的类型,指定该方法所操作的数据类型。
  • ReceiverType:是接收器的名称,通常是类型的一个实例,但也可以是该类型的指针。
  • MethodName:方法的名称。
  • parameters:方法的其他参数。
  • returnType:方法的返回类型。

3. 接收器的类型

Go 支持两种类型的接收器:值接收器指针接收器。这决定了方法中对接收器的修改是否会影响原始对象。

3.1 值接收器(Value Receiver)

值接收器是在方法调用时,复制接收器对象的副本。当你在方法内对接收器对象进行操作时,修改不会影响到原始对象。通常当你不打算修改接收器对象的状态时,使用值接收器。

示例:

package main

import "fmt"

type Rectangle struct {
    width, height int
}

// 值接收器方法
func (r Rectangle) Area() int {
    return r.width * r.height
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    fmt.Println("Area of rectangle:", rect.Area())  // 输出:Area of rectangle: 50
}

在这个例子中,Area() 方法的接收器是 Rectangle 的值接收器,因此 Area() 方法内部对 r 的修改不会影响原始的 rect

3.2 指针接收器(Pointer Receiver)

指针接收器使用指向接收器类型的指针。在方法调用时,接收器参数是该对象的地址。指针接收器允许在方法内部修改接收器对象的状态。

示例:

package main

import "fmt"

type Rectangle struct {
    width, height int
}

// 指针接收器方法
func (r *Rectangle) SetWidth(width int) {
    r.width = width
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    rect.SetWidth(20)
    fmt.Println("Updated rectangle:", rect)  // 输出:Updated rectangle: {20 5}
}

在这个例子中,SetWidth() 方法的接收器是指针接收器,因此可以通过该方法修改 rect 对象的 width 属性。

4. 为什么选择指针接收器或值接收器?

  • 值接收器:适用于方法不需要修改接收器的情况下,或者接收器类型是小型类型(如基础类型、结构体等),复制副本开销小。Go 的值接收器对于避免对原始对象的影响非常有效。

  • 指针接收器:适用于需要修改接收器对象的情况下,或者接收器类型较大,避免每次复制带来的性能问题。

5. 接收器的命名

接收器的命名可以是任何合适的名字,Go 语言对命名没有特别要求。通常采用短小的名字,尤其是单字符的变量名,以符合 Go 的编码规范。常见的接收器命名包括:

  • r:通常用于 Rectangle 类型的接收器。
  • s:通常用于 String 类型的接收器。
  • t:常用于 Time 类型的接收器。

不过,命名接收器时没有强制规则,可以根据需求进行命名。

6. 接收器与方法的绑定

接收器可以绑定到某个类型或类型的指针。当你调用方法时,Go 会自动根据需要将接收器转换为相应的值或指针。你可以将指针类型的变量传递给值接收器,反之亦然,只要类型一致。

示例:自动转换
package main

import "fmt"

type Rectangle struct {
    width, height int
}

// 指针接收器
func (r *Rectangle) SetWidth(width int) {
    r.width = width
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    rect.SetWidth(20)  // Go 会自动将 rect 的值转换为指针
    fmt.Println("Updated rectangle:", rect)  // 输出:Updated rectangle: {20 5}
}

在上述代码中,rectRectangle 的值类型,但 SetWidth() 方法接受指针接收器,Go 会自动将 rect 的地址传递给方法。

7. 接收器的使用场景

  • 值接收器:当方法不修改接收器的值,并且接收器的复制开销较小时,使用值接收器。
  • 指针接收器:当方法需要修改接收器的值,或者接收器对象较大时,使用指针接收器。

8. 接收器的限制

  1. 方法与接口:当一个类型的方法使用了值接收器时,该类型才能实现接口;而当类型的方法使用指针接收器时,只有类型的指针才能实现该接口。
  2. 传递给方法的参数:如果方法定义了指针接收器,你必须传递指向该类型的指针给方法,反之亦然。

总结

Go 语言的接收器(Receiver)是绑定方法到特定类型的机制,分为值接收器和指针接收器两种类型,决定了方法如何访问和修改接收器对象的状态。选择适当的接收器类型可以优化代码的性能,并且正确地使用接收器能有效管理对象的状态和行为。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 高级爬虫笔记(六)scrapy框架基础知识

目录 一、Scrapy框架基础知识1.1、什么是scrapy?1.2、scrapy的工作流程1.3、scrapy中每个模块的作用:1.4、scrapy的入门使用1.4.1 安装scrapy1.4.2、scrapy项目实现流程1.4.3、创建scrapy项目1.4.4、创建爬虫1.4.5、完善spider1.4.6、配置settings文件1.…

每日一题-两个链表的第一个公共结点

文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表,找到它们的第一个公共节点。如果没有公共节点&#xff0c…

Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索

作者:来自 Elastic Tommaso Teofili 了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。 在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一,特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的,当数据集规模…

两种方式实现Kepware与PLC之间的心跳检测

两种方式实现Kepware与PLC之间的心跳检测 实现Kepware与PLC之间的心跳检测1.OPCUA 外挂程序2.Kepware Advanced Tag 实现Kepware与PLC之间的心跳检测 1.OPCUA 外挂程序 这是通过上位程序来触发心跳的一种机制,在C#中,可以利用OPC UAOPCAutodll的方式…

python-leetcode-文本左右对齐

68. 文本左右对齐 - 力扣(LeetCode) class Solution:def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:result []current_line []current_length 0for word in words:# 如果当前行加上这个单词后超过 maxWidth,则…

全新免押租赁系统打造便捷安全的租赁体验

内容概要 全新免押租赁系统的推出,标志着租赁行业的一次重大变革。这个系统的最大特点就是“免押金”,大大减轻了用户在租赁过程中的经济负担。从此,不再需要为一部手机或其他商品支付高昂的押金,用户只需通过简单的信用评估&…

WordPress静态缓存插件WP Super Cache与 WP Fastest Cache

引言 WordPress是一款开源的内容管理系统(CMS),最初作为博客平台开发,现已发展成为一个功能强大的建站工具,支持创建各种类型的网站,包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…

1.CSS的复合选择器

1.1 什么是复合选择器 在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素(标签) 复…

初学stm32 --- ADC模拟/数字转换器工作原理

目录 常见的ADC类型 并联比较型工作示意图 逐次逼近型工作示意图 ADC的特性参数 STM32各系列ADC的主要特性 ADC框图简介 参考电压/模拟部分电压 输入通道( F1为例) 转换序列(F1为例) 规则组和注入组执行优先级对比 规则…

【C++】深入理解迭代器(Iterator)

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯什么是迭代器?迭代器与指针的比较 💯std::string 中的迭代器示例代码与图示分析运行结果:图示说明: 小提示 💯正…

H266/VVC 帧内预测中 MDIS 技术

参考像素平滑滤波 MDIS VVC 的帧内预测参考像素获取过程和 HEVC 相同,但参考像素滤波过程有所改进。在H.266中 MDIS(Mode Dependent Intra Smoothing)即模式依赖帧内平滑滤波,是对帧内预测的亮度分量参考像素进行滤波决策的一个技…

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候,因为浏览器自身的安全设置问题, 对于https的网页访问会出现安全隐私的提示, 甚至无法访问对应的网站,尤其是chrome浏览器, 因此本文主要讲解如何设置chrome浏览器的设置,来解决该问题&…

深入解析 Transformer:从原理到可视化再到PyTorch实现

文章目录 深入解析 Transformer1 理解 Transformer1.1 理解自注意力机制 (Self-Attention)1.2 理解位置编码 (Positional Encoding)1.2.1 整数编码1.2.2 正弦编码 1.3 理解编码器和解码器模块1.3.1 编码器 1.4 最终线性层和 Softmax 层 2 编写 Transformer 的代码2.1 摘要和引言…

系统架构设计师考点—软件工程基础知识

一、备考指南 软件工程基础知识主要考查的是软件工程基础、软件开发方法、系统分析、设计、测试及运行和维护等相关知识,同时也是重点考点,在系统架构设计师的考试中选择题12~15分,案例分析和论文中也会考到相关内容,属于重点章节…

电影动画shader解析与实现

着色器代码解析 大家好!我是 [数擎AI],一位热爱探索新技术的前端开发者,在这里分享前端和Web3D、AI技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:…

使用ML.NET进行对象检测

1、前言 ML.NET 是面向 .NET 开发人员的开源跨平台机器学习框架,支持将自定义机器学习模型集成到 .NET 应用程序中。 它包含一个 API,其中包含不同的 NuGet 包、名为 模型生成器的 Visual Studio 扩展,以及作为 .NET 工具安装的 命令行接口。…

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…

vue -关于浏览器localstorge数据定期清除的实现

1.实现背景 用户登录时的信息存在了localstorge中&#xff0c;但它会一直存在。一般来说&#xff0c;我们希望这个数据能够定期被清除掉&#xff0c;以下一个定时清除的实现。 2.实现原理 在用户登录时&#xff0c;将用户信息存入localstorge的同时&#xff0c;将当前时间作…

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

Collaborate with AI -- Write a modern C++ singleton factory

translate my blog <<与AI合作 -- 写一个modern c单例工厂>> to English. NOTE: It was written at 2024.01, maybe the AI is not smart as now. Preface In this article, readers can learn about a hybrid of the modern C singleton pattern and factory pat…