对象:方法隐式接收实例

本文探讨了Go语言中方法的实现原理,强调方法实际上是一种特殊的函数调用格式。文章介绍了方法与函数的区别在于第一个参数的处理,无论是值类型还是指针调用,编译器都会自动进行转换。此外,文章还讨论了使用值类型和指针类型作为方法接收者的影响,以及官方推荐使用简短的字母来代替this、self等参数名的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

02 隐式实例接收参数receiver

Go限制是给一个类型定义方法只能在当前包,如果不是在当前包不能为它定义方法。像C#可以给标准库里面的类型增加扩展方法。Go涉及的思想基于的是包是个封闭状态,定义扩展方法实际上是侵入式设计。我们设计时候尽可能希望依赖关系变得很简单,因为多数时候我们并不需要把我们依赖的东西暴露出去。

定义方法两种方式,第一种选择与接口类型相绑定pointer,还有一种选择与值类型相绑定value。这隶属于不同的方法集。

创建一个变量,有两种执行方式,直接用值类型调用接口方法。或者取指针,指针同样会调用任何方法。编译器会帮我们处理类型的转换,这就是很典型的语法糖。换句话说,我们不应该用方法的概念理解它,这种语法糖给我们的困惑在于为什么区分*XX。是因为如果把方法翻译为函数,不要用方法来理解把它转换为函数来理解,就会知道这两种函数执行方式根本不同。方法和函数的区别在于第一个参数,编译器其实做了很特殊的处理在于把方法用特殊的语法表达出来然后执行时候也用特殊的语法来表达,其实就是编译器上的语法糖。不管是方法还是函数翻译到汇编层面其实就是text段一段代码,方法和函数都要传参数。

不管是用值类型调用还是指针调用,它就是把第一个参数翻译一下。

type X int

func (x *X) pointer() {
    f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值