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的压力。除非是大对象,一般不太用指针。