当前位置: 首页 > news >正文

Go语言中值类型和指针类型接收器到底该如何调用才合理?

学习或使用Go语言时,大家在用值或指针调用方法时,有没有不踏实的感觉?因为方法接收器有值类型和指针类型,不同类型的接收器到底怎么调用才是合理的?


方法,带有接收器的函数,通常使用接收器类型值调用。

如下声明代码:

type T struct{}// value receiver
func (tv T) Mv(a int) int { return 0 }// pointer receiver
func (tp *T) Mp(f float32) float32 { return 1 }// make value of T
func makeT() T {return T{}
}// make value of *T
func makeTP() *T {return &T{}
}

声明了结构体类型T,以及对应的值和指针接收器方法。

还声明一个makeT,和makeTP用来创建T*T的值。

调用形式代码:

func TestAddressAuto(t *testing.T) {var tv Tvar tp *T// Mv is applied to valuetv.Mv(1)// Mp is applied to pointertp.Mp(2)// Mv is applied to pointertp.Mv(3) // same as (*tp).Mv(3), Mv is in method set of tp, automatically dereference// Mp is applied to valuetv.Mp(4) // shorthand for (&tv).Mp(4)// (&tv).Mp(4)makeT().Mv(5)//  result of makeT() is unaddressable// makeT().Mp(6) // cannot call pointer method Mp on TcompilerInvalidMethodExpr// result of makeTP is addressablemakeTP().Mv(7)makeTP().Mp(8)
}

调用代码中,共8个调用方式,用了不同的参数来标识。

注意,其中makeT().Mp(6)形式的调用时语法错误的。

下面依次说明每次调用的语法:从第3点要开始注意

  1. tv.Mv(1),值调用值接收器方法,理所当然。
  2. tp.Mp(2),指针调用指针接收器方法,理所当然。下面要注意了!!!
  3. tp.Mv(3),指针调用值接收器方法,完全可行。这里涉及两个点:
    • *T类型的方法集包括值和指针接收器的方法,因此Mv本就是*T的方法;
    • 会自动对tp进行解引用操作,就是(*tp).Mv(3)
  4. tv.Mp(4),值调用指针接收器方法,可行。因为这是(&tv).Mp(4)的简写,两者等同。也就是该语法会对tv自动地做取地址操作。这里要注意的是**Mp不是T的方法,只是简写**。
  5. makeT().Mv(5),值调用值接收器方法,理所当然,同1。
  6. makeT().Mp(6),语法错误,编译不通过。因为**makeT()的返回值是不可寻址的**,要注意这不同于变量,也就是不同于4。
  7. makeTP().Mv(7),指针调用值接收器方法,完全可行。同3。
  8. makeTP().Mp(8),指针调用指针接收器方法,理所当然。同2。注意与makeT().Mp(6)的不同,makeTP()的结果是*T类型,是可以寻址的。

总的来说,就是要注意方法集中是否包含,以及在调用时会发生什么,例如自动解引用,自动取址等。


知道这些后,利用值或指针调用方法就不会不踏实了~~

http://www.dtcms.com/a/390230.html

相关文章:

  • Apollo星火计划Pnc笔记(一)
  • 设计模式(C++)详解—装饰器模式(2)
  • 复旦×明略×秒针:用AIGD把经验决策变科学决策
  • Apache SeaTunnel 2.3.12 发布!核心引擎升级、连接器生态再扩张
  • Java中存在哪些锁?
  • 非连续性内存分配:分页
  • [x-cmd] x-cmd 性能
  • Zynq开发实践(SDK之定时器)
  • Java IO核心知识提问点
  • 微前端--前端架构的模块化革命
  • SQL分析-基础
  • V821---4M高集成无线视频芯片
  • count down 92 days
  • 学习日记-JS+DOM-day58-9.18
  • 【Python】基于界面库PyQt5+QTLinguist的多语言切换功能实现
  • Flutter 组件介绍:TickerMode
  • SQL 聚合函数总结:COUNT、SUM、AVG、MAX、MIN 详解
  • 资深专业新媒体营销数字营销培训老师商学院教授课程老师培训讲师唐兴通讲授10大经典社群私域案例:Lululemon的热汗式信仰社群运营社群活动
  • 玉米病虫害数据集检测识别数据集:近4k图像,7类,yolo标注
  • Batch Size与预热导致深度学习模型推理时间忽快忽慢
  • 过滤器(Filter)与拦截器(Interceptor)知识点总结
  • 深度学习与机器学习
  • Linux服务器从零开始-mysql安装
  • Emacs 折腾日记(三十)——打造C++ IDE 续
  • 解密DNS:互联网的隐形导航系统
  • Mysql修改用户密码,修改MySQL密码如何安全的步骤是什么
  • PS练习2:将图片贴入实际环境中
  • cocos shader 流光环绕
  • kali nethunter 开启ssh
  • vue3滚动到顶部钩子函数+组件简单示例