分享
golang学习笔记:如何选择方法的receiver类型
勇Max · · 1283 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
在写代码的过程中,经常会会涉及到方法的receiver类型选择的问题,通常会纠结于用T还是*T,记住以下原则问题便迎刃而解:
- 要修改实例状态,用*T。
- 无须修改状态的小对象或固定值,建议用T。
- 大对象建议用*T,以减少复制成本。
- 引用类型、字符串、字典、函数等指针包装对象,直接用T。
- 若包含Mutex等同步字段,用*T,避免因赋值造成锁操作无效。
- 其他无法确定的情况都用*T。
可使用实例值或指针来调用方法,编译器会根据方法receiver类型自动在基础类型和指针类型间转换。
type N int
func (n N)Value(){
n++
fmt.Printf("%p, %v\n",&n,n)
}
func (n *N)Pointer(){
*n++
fmt.Printf("%p, %v\n",n,*n)
}
func main() {
var a N = 25
p:=&a
a.Value()
a.Pointer()
p.Value()
p.Pointer()
fmt.Printf("%p, %v\n",&a,a)
}
另外例如字典等本身就是指针包装对象的,取地址时没必要再加&地址符。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1283 次点击
上一篇:mac 安装golang
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
在写代码的过程中,经常会会涉及到方法的receiver类型选择的问题,通常会纠结于用T还是*T,记住以下原则问题便迎刃而解:
- 要修改实例状态,用*T。
- 无须修改状态的小对象或固定值,建议用T。
- 大对象建议用*T,以减少复制成本。
- 引用类型、字符串、字典、函数等指针包装对象,直接用T。
- 若包含Mutex等同步字段,用*T,避免因赋值造成锁操作无效。
- 其他无法确定的情况都用*T。
可使用实例值或指针来调用方法,编译器会根据方法receiver类型自动在基础类型和指针类型间转换。
type N int
func (n N)Value(){
n++
fmt.Printf("%p, %v\n",&n,n)
}
func (n *N)Pointer(){
*n++
fmt.Printf("%p, %v\n",n,*n)
}
func main() {
var a N = 25
p:=&a
a.Value()
a.Pointer()
p.Value()
p.Pointer()
fmt.Printf("%p, %v\n",&a,a)
}
另外例如字典等本身就是指针包装对象的,取地址时没必要再加&地址符。