go value receiver, pointer receiver 方法集

cdz620 · · 661 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go 语言规范里定义的 method sets 规则

Values 可调用的方法(methods receivers) 备注
T (t T) funcXXX 为什么不能调用 (t *T) funcXXX,因为无法保证所有的Value 都可以获取到指针地址(addressable value)
*T (t T) funcXXX and (t *T) funcXXX go 自动转化(dereferenced) *T --> T, 所以可以调用

为什么有些值无法获取地址?
go spec: https://golang.org/ref/spec#Address_operators 说明了不能寻址的情况。

常见的不能寻址的情况:

&m["key"]
&afunc()
&t.method()

var x *int = nil
*x   // causes a run-time panic
&*x  // causes a run-time panic

// 如果用变量保存中间结果值,就可寻址
v := afunc()
&v

总结:本质原因语言特性所决定的,目前官方文档无较明确对该现象的定义;作为语言使用者,可以理解为go本身语言特性决定的问题,知道一些常见的反例,注意避开情况。

参考文档


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:cdz620

查看原文:go value receiver, pointer receiver 方法集

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

661 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传