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

golang">type A struct{}

func test(a *A) {

}

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

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

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

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

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

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

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

回答

以上是 【go】golang 参数都使用指针传递有什么缺点 的全部内容, 来源链接: www.h5w3.com/115044.html

回到顶部