Golang 开发实战day14 - Reciver Functions with Pointers

embedded/2024/10/9 15:15:54/

🏆个人专栏
🤺 leetcode
🧗 Leetcode Prime
🏇 Golang20天教程
🚴‍♂️ Java问题收集园地
🌴 成长感悟
欢迎大家观看,不执着于追求顶峰,只享受探索过程

Golang 开发实战day14 - 接收者函数与指针

  在 Golang 中,接收者函数是一种强大的工具,可以让我们更灵活地定义方法,提高代码的简洁性和可维护性。而指针则是 Golang 中另一种重要的概念,用于指向内存中的数据。当我们将接收者函数与指针结合使用时,我们可以获得更加强大的功能和灵活性。

1. 接收者函数与指针的基本概念

  接收者函数: 接收者函数是一种与结构体或接口相关联的一组函数,用于对该类型的数据进行操作。

接收者函数的语法如下:

1.1 接收者函数

func (receiver TypeName) methodName(parameters) {// 方法体
}

1.2 指针

  指针是指向内存地址的变量。使用指针可以访问和修改内存中的数据。指针的声明语法如下:

var pointerType *TypeName
pointerType := &variable

1.3 接收者函数与指针的结合

  我们可以在接收者函数的参数中使用指针类型,这样就可以直接修改结构体本身的数据,而不是副本。

2. 接收者函数与指针的优点

  • 提高效率: 使用指针可以避免值的复制,提高代码的运行效率。
  • 修改结构体数据: 可以直接修改结构体本身的数据,而不是副本。
  • 简洁易读: 代码更加简洁易读,易于理解。

3. 接收者函数与指针的示例代码

3.1 示例一、x, y轴移动

type Point struct {x inty int
}func (p *Point) Move(dx int, dy int) {p.x += dxp.y += dy
}func (p Point) String() string {return fmt.Sprintf("(%d, %d)", p.x, p.y)
}func main() {point := Point{x: 10, y: 20}pointPtr := &point 			// 获取 point 的指针pointPtr.Move(5, 10) 		// 使用指针调用 Move 方法fmt.Println(point) 			// 输出 (15, 30)fmt.Println(pointPtr.String()) // 输出 (15, 30)
}

Output:
在这里插入图片描述

3.2 示例二 修改年龄

type Person struct {Name stringAge  int
}func (p *Person) SetAge(newAge int) {p.Age = newAge
}func main(){person := Person{Name: "大雄", Age: 10}personPtr := &personpersonPtr.SetAge(40) // 使用指针调用 SetAge 方法fmt.Println(person.Age) // 输出 40(别问,问就是大雄经过时光机变中年人了)
}

Output:
在这里插入图片描述

3.3 示例三 匿名函数与函数指针结合

type MyString stringfunc (s *MyString) ToUpper() *MyString {// 利用匿名函数和strings.Map进行高效转换uppercase := strings.Map(func(r rune) rune {if r >= 'a' && r <= 'z' {return r - 32 // 使用 ASCII 差异有效地将小写转换为大写}return r // 保持其他字符不变}, string(*s))// 将转换后的字符串分配给 MyString 的基础值*s = MyString(uppercase)return s
}
func main(){str := MyString("hello , doraemon!")strPtr := &strstrPtr.ToUpper() // 使用指针调用 ToUpper 方法fmt.Println(*strPtr)
}
HELLO , DORAEMON!

总结

  总之,接收者函数与指针是 Golang 中强大的工具,可以让我们更灵活地操作结构体数据,提高代码的效率和可读性。理解和掌握接收者函数与指针的使用技巧,可以帮助你写出更加优雅、高效的 Golang 代码。


http://www.ppmy.cn/embedded/39819.html

相关文章

Selenium的自动化测试技巧有多少?【建议收藏】

Selenium是一个用于自动化Web应用程序测试的工具。它提供了一组API&#xff0c;允许用户与Web浏览器进行交互&#xff0c;来执行各种自动化测试任务。本文将从零开始&#xff0c;详细介绍Selenium的自动化测试技巧。 第一步&#xff1a;安装Selenium 首先&#xff0c;您需要安…

巨坑啊! before-upload返回false 会执行on-remove

通过对on-remove对应参数的打印&#xff0c;发现回调中的file参数有个status&#xff0c;若是是在before-upload中就被过滤了&#xff0c;就是ready&#xff0c;若是已经上传成功了去点击删除&#xff0c;status是success&#xff0c;就他了。 onRemove(file,fileList){if(file…

嘎嘎好用的虚拟键盘第二弹之中文输入法

之前还在为不用研究输入中文而暗自窃喜 这不新需求就来了&#xff08;新需求不会迟到 它只是在路上飞一会儿&#xff09; 找到了个博主分享的代码 是好使的 前端-xyq 已经和原作者申请转载了 感谢~~ 原作者地址&#xff1a;https://www.cnblogs.com/linjiangxian/p/16223681.h…

linux下sd卡的备份与还原

在Ubuntu上制作SD卡备份镜像&#xff0c;你可以使用dd命令。以下是一个基本的步骤和示例代码&#xff1a; 插入SD卡到电脑。确定SD卡设备路径&#xff0c;使用lsblk或sudo fdisk -l命令。确定备份镜像文件的路径。使用dd命令制作备份。 示例代码&#xff1a; bash# 查看连接的…

深入解析RedisSearch:全文搜索的新维度

码到三十五 &#xff1a; 个人主页 在当今的数据时代&#xff0c;信息的检索与快速定位变得尤为关键。Redis&#xff0c;作为一个高性能的内存数据库&#xff0c;已经在缓存和消息系统中占据了重要地位。然而&#xff0c;Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

Android 蓝牙实战——蓝牙电话通话状态分析(二十三)

在前面的《Android 蓝牙——HFP协议(九)》中我们知道了蓝牙电话主要使用的是 HFP 协议,这里我们主要分析一些客户端如何获取蓝牙电话状态的变化。 一、电话状态查询 1、HeadsetClientStateMachine 源码位置:/packages/apps/Bluetooth/src/com/android/bluetooth/hfpclie…

Java入门基础学习笔记1——初识java

1、为什么学习java&#xff1f; 几乎统治了服务端的开发&#xff1b;几乎所有的互联网企业都使用&#xff1b;100%国内大中型企业都用&#xff1b;全球100亿的设备运行java。开发岗位薪资高。 Java的流行度很高&#xff0c;商用占有率很高。 可移植性。 2、Java的背景知识 …

近似消息传递算法(AMP)单测量模型(SMV)

1、算法解决问题 很多人致力于解决SLM模型的求逆问题&#xff0c;即知道观测值和测量矩阵&#xff08;字典之类的&#xff09;&#xff0c;要求未知变量的值。SLM又叫做标准线性模型&#xff0c;后续又在此基础上进行升级变为广义线性模型。即SLM是yAxe&#xff0c;这里是线性…