Go-学会方法的基本使用

本节重点:

  • 学会方法的基本使用

方法主要源于 OOP 语言,在传统面向对象语言中 (例如 C++), 我们会用一个“类”来封装属于自己的数据和函数,这些类的函数就叫做方法。

虽然 Go 不是经典意义上的面向对象语言,但是我们可以在一些接收者(自定义类型,结构体)上定义函数,同理这些接收者的函数在 Go 里面也叫做方法。

方法的声明

方法(method)的声明和函数很相似, 只不过它必须指定接收者:

func (t T) F() {}

注意:

  • 接收者的类型只能为用关键字 type 定义的类型,例如自定义类型,结构体。
  • 同一个接收者的方法名不能重复 (没有重载),如果是结构体,方法名还不能和字段名重复。
  • 值作为接收者无法修改其值,如果有更改需求,需要使用指针类型。

简单例子

现在我们写一个简单的程序,在结构类型上创建一个方法并调用它。

package mainimport (  "fmt"
)type Employee struct {  name     stringsalary   intcurrency string
}func (e Employee) displaySalary() {  fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
}func main() {  emp1 := Employee {name:     "Sam Adolf",salary:   5000,currency: "$",}emp1.displaySalary()
}

在上面程序的第 13 行中,我们在 Employee 结构体类型上创建了一个方法 displaySalarydisplaySalary() 方法可以访问其中的接收者 e。我们使用收款人 e,打印员工的 namecurrency 和 salary

我们在第23行使用该方法调用了 emp1.displaySalary()

上面程序的输出是 :Salary of Sam Adolf is $5000

指针接收器与值接收器型

前面都是带有值接收器的方法。可以使用指针接收器创建方法。值和指针接收器之间的区别在于,在具有指针接收器的方法内部所做的更改对调用者是可见的,而在值接收器中则不然。让我们在程序的帮助下理解这一点。

package mainimport (  "fmt"
)type Employee struct {  name stringage  int
}/*
Method with value receiver  
*/
func (e Employee) changeName(newName string) {  e.name = newName
}/*
Method with pointer receiver  
*/
func (e *Employee) changeAge(newAge int) {  e.age = newAge
}func main() {  e := Employee{name: "Mark Andrew",age:  50,}fmt.Printf("Employee name before change: %s", e.name)e.changeName("Michael Andrew")fmt.Printf("\nEmployee name after change: %s", e.name)fmt.Printf("\n\nEmployee age before change: %d", e.age)(&e).changeAge(51)fmt.Printf("\nEmployee age after change: %d", e.age)
}

在上面的程序中,changeName 方法有一个值接收器 (e Employee),而 changeAge 方法有一个指针接收器 (e *Employee)。在 changeName 中对 Employee 结构体的 name 字段所做的更改对调用者是不可见的,因此程序会在方法 e 之前和之后打印相同的 name。因为 changeAge 方法有一个指针接收器 (e *Employee),所以在方法调用 (&e) 之后对 age 字段所做的更改 (51) 将对调用者可见。这个程序打印:

Employee name before change: Mark Andrew  
Employee name after change: Mark AndrewEmployee age before change: 50  
Employee age after change: 51 

何时使用指针接收与值接收

通常,当调用者应该可以看到方法内对接收器所做的更改时,可以使用指针接收器。

指针接收器也可用于复制数据结构成本高昂的地方。考虑一个具有许多字段的结构。将此结构用作方法中的值接收器将需要复制整个结构,这将是昂贵的。在这种情况下,如果使用指针接收器,则不会复制结构,而在方法中只会使用指向它的指针。

在所有其他情况下,可以使用值接收器。

命名冲突

a. 接收者定义的方法名不能重复, 例如:

package maintype T struct{}func (T) F()         {}
func (T) F(a string) {}func main() {t := T{}t.F()
}

运行代码我们会得到 method redeclared: T.F 类似错误。

b. 结构体方法名不能和字段重复,例如:

package maintype T struct{F string
}func (T) F(){}func main() {t := T{}t.F()
}

运行代码我们会得到 : type T has both field and method named F 类似错误。

同一个接收者的方法名不能重复 (没有重载);如果是结构体,方法名不能和字段重复。

接收者可以同时为值和指针

在 Go 语言中,方法的接收者可以同时为值或者指针,例如:

package maintype T struct{}func (T) F()  {}
func (*T) N() {}func main() {t := T{}t.F()t.N()t1 := &T{} // 指针类型t1.F()t1.N()
}

可以看到无论值类型 T 还是指针类型 &T 都可以同时访问 F 和 N 方法。

值和指针作为接收者的区别

同样我们先看一段代码:

package mainimport "fmt"type T struct {value int
}func (m T) StayTheSame() {m.value = 3
}func (m *T) Update() {m.value = 3
}func main() {m := T{0}fmt.Println(m) // {0}m.StayTheSame()fmt.Println(m) // {0}m.Update()fmt.Println(m) // {3}
}

运行代码输出结果为:

{0}
{0}
{3}

值作为接收者(T) 不会修改结构体值,而指针 *T 可以修改。

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

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

相关文章

蓝桥杯嵌入式(G431)备赛笔记——PWM+LCD+按键

目录 题目要求(真题): cubeMX配置: 小试牛刀: Keil代码: 效果演示: 题目要求(真题): 使用第十一届第二场真题,练习PWM波部分的代码&#xff0c…

德国FSL18罗德与施瓦茨频谱分析仪

181/2461/8938产品概述: 频率范围:9 kHz至18 GHz(超范围至20 GHz)频率分辨率:1赫兹28 MHz的信号分析带宽低测量不确定性,即使在微波范围内通用测量应用,例如光谱图轻巧紧凑,便于现场安装、维护和服务 9 kH…

【图论】链式前向星+BFS实现拓扑排序(topSort)

拓扑排序 👏引入 重要概念: 入度:表示一个结点的所有前结点的个数 问题:给定 n 个结点和 m 个边,然后输入所有的边,输出拓扑排序序列 topsort在网上有很多的介绍,这里就省略,主要讲解拓扑排序的思路。 🤔思…

Anthropic Claude 3 加入亚马逊云科技 AI“全家桶”

编辑 | 宋慧 出品 | CSDN AIGC 每天都有新动态发生。最新的消息是亚马逊在 3 月底完成了对 Anthropic 的 40 亿美元投资(也是亚马逊 30 年来最大一笔外部投资),以及 GPT-4 最强对手的 Anthropic Claude 3 已经在亚马逊云科技 Amazon Bedrock…

什么是企业邮箱?企业邮箱和个人邮箱的区别是什么?

拥有一个企业邮箱究竟能给公司带什么益处?这是许多中小企业管理者好奇的,很多人觉得邮箱只要用来收发邮件就够了。但实际上,什么是企业邮箱?企业邮箱和个人邮箱在功能范围有着很大的区别。好的企业邮箱不仅能提高公司内部的沟通效…

【电控笔记5】电流环pi参数整定

旋转坐标系下的电压方程,由id和iq计算出ud和uq 把常数项(上面两个红框)拿出来解耦合,作为前馈,如下 电流环传递函数 电流带宽 响应时间 另一种方法:内膜控制器

RISC-V特权架构 - 中断注入

中断注入 1 中断注入的作用2 mip寄存器3 中断注入后的处理过程 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 中断注入的作用 中断注入,就是在M模式下,手动向S模式去产生一个中断。 比如:向mip寄存器的bit5…

Web前端开发——Vue概述

前言: 整理下学习笔记,打好基础,daydayup!!! Vue Vue是一套前端框架,基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的专注点放在数据上,可以免除原生JavaScript中的DOM操作&am…

600MA线性锂电池充电芯片 - YB4054DJ

描述: YB4054一款完整的单节锂离子电池充电器。其SOT23-5的封装与较少的外部元件数使得YB4054成为便携式应用的理想选择。采用了内部PMOSFET架构,加上防倒充电路,不需要外部检测电阻器和隔离二极管。热反馈可对充电电流进行自动调节,以便在大…

基于Linux C++多线程服务器 + Qt上位机开发 + STM32 + 8266WIFI的智慧无人超市

前言 针对传统超市购物车结账排队时间长、付款效率低的问题,提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账,理由显而易见:自助收银机结账很方便,几乎不用排队&am…

“反正你又看不到,少写一行又何妨......”

单链表专题 1.链表的概念及结构2. 实现单链表3. 链表的分类 1.链表的概念及结构 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 链表的结构跟火车车厢相似,淡季时⻋次的⻋厢…

GraphQL API-通过未被净化的参数获取隐私信息

GraphQL API-通过未被净化的参数获取隐私信息 Lab: Accessing private GraphQL posts实验前置必要知识点 在GraphQL端点发送任何query{__typename},它将在其响应中的某处包含{"data": {"__typename": "query"}}字符串,这…

JZM-A系列机械隔膜计量泵

引言: 在现代工业生产过程中,对流体材料的精准计量和输送需求日益提高。面对这一挑战,JZM-A系列机械隔膜计量泵以其卓越的设计、准确的计量能力和高效的性能,为各行各业提供了一种可靠的解决方案。本文将详细解析JZM-A系列计量泵的…

Python100个库分享第13个—awesome-slugify(处理Unicode)

目录 专栏导读库的介绍库的安装基础用法1:用‘-’连接基础用法1:汉字转拼音用‘-’连接有个类似的库 —python-slugify安装总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代,社交媒体已经成为人们日常生活的重要组成部分,而Facebook作为最知名的社交媒体平台之一,其成功之处备受瞩目。本文将深入解析Facebook的成功密码,探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

6.1Python之字典的初识

【1】字典的创建与价值 字典(Dictionary)是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中,键(Key)必须是唯一的,而值(Value)则可以是任意类型的数据。…

ue4打包多模块

首先,每个模块,包含插件内的模块在内,都要用IMPLEMENT_MODULE(类名, 模块名)的方式,模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用,用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

花花省V6淘宝客APP社交电商自营商城聚合优惠券系统

首页广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加油、阿里巴巴、去哪网、电影票、飞猪旅行、美团酒店、当当网、肯德基、热门抖货、商品推荐、商品详情、…

基于Springboot + vue +MySQL 留守儿童爱心网站 (含源码)

目录 📚 前言 📑摘要 📑系统架构 📚 数据库设计 💬 志愿活动属性图 💬 爱心捐赠实体属性 📚 系统功能的具体实现 💬 系统功能模块 宣传新闻 志愿活动 💬 管理员功…

基于java+springboot+vue实现的售楼管理系统(文末源码+Lw)23-255

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…