问答

golang 参数都使用指针传递有什么缺点

作者:admin 2021-04-20 我要评论

type A struct{}func test(a *A) { } 我们在调用test方法时,参数 a 传递的类型可能为 a *A 或者 a A ,既然传递指针的时候可以减少值拷贝,为什么参数不统一传递...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
type A struct{}

func test(a *A) {
    
}

我们在调用test方法时,参数a传递的类型可能为 a *A 或者 a A,既然传递指针的时候可以减少值拷贝,为什么参数不统一传递一个指针类型呢,不管读取或者修改对象都很方便(排除map和slice这种参数,同样排除掉那种只想传递值拷贝的情况)

###

误修改。自己写代码到没什么,假入项目很大,或者你写的开源库,一定要保证字段的归属问题。一般的解决方案都是不可导出字段加方法。

作为函数的参数的时候,传递指针有时候需要频繁的 取值 操作。而方法的接受者指针可以自动转换。

###

是的,你的想法是对的,这样效率高,动态语言如python、javascript都是这样做的。只不过比较麻烦

###

没有写过go,只写过c++,勉强装一下
值传递 如你所说存在拷贝【像c++就有拷贝构造函数,拷贝赋值函数】
指针【只是一段内存,大家称为指针】传递 接收者接收到的就是一段内存,这个时候大家共同指向同一段内存地址,内部修改,外部也会跟着改变,毕竟同一块内存,在c++中就有这个移动构造函数,移动赋值,移动语义。

1 引用传递内部的误修改可能会影响到外部传递的数据
2 在多线程中,默认情况下跨线程传递参数是值拷贝方式,如主线程传递给B子线程,B线程是拷贝方式存起来操作,这样就不会影响到主线程的数据,如果主线程结束了【默认一般是整个进程结束,所有子线程被强制终止】,如果指针传递,主线程结束了,但是对象A对(你们可能叫结构体)是在主线程声明定义的,传递给子线程,子线程还没有执行,或是执行到一半,而主线程结束释放了该对象的内存,子线程还去操作这个已经被回收的内存,程序立马报错。如果是值传递,子线程是拷贝过去的,就不会存在这种问题。

以上我是开发多线程项目时遇到的经验。不知道适合不适合你们go.仅供参考。

###

会更容易遇到panic??

###

指针传递会引发内存逃逸,会增加GC的压力。除非是大对象,一般不太用指针。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器