go笔记——参数传递方式

1. 参数传递方式的对比 Java VS Go

在java中基本类型(int等)是按值传递,而非基本类型则是按引用传递。
然而在go中一律是按值传递,无论传递的指针、引用还是值,最终都会在函数栈中copy实参的数据到形参中。

2. go中参数传递的性能对比

表面上看传递指针或引用性能更好,因为不需要复制原始大小的数据,只需要复制指向实参数据的指针地址,但实际上被复制的指针会延长对象的生命周期。go通过逃逸分析机制,可能出现导致实参逃逸到堆上的情况。
值传递通常开销更小
即使Go看起来有点像C,它的编译器工作方式也不同。C的类比并不总是和Go一起工作。在Go中值传递可能比指针传递开销更小。发生这种情况是因为Go使用逃逸分析来确定变量是否可以安全地分配到函数的栈帧上,这可能比在堆上分配变量开销小的多。通过值传递可以简化Go中的逃逸分析,并为变量提供更好的分配机会。

3. 按需使用

预定的选择:有时选择是由使用上下文预先确定的。让我们来看看最常见的用例。

  • 变量不能被修改
    我们没有其他的选择,只能通过值传递。所以这个变量不能在下游修改。反之亦然,如果变量被期望修改,它必须通过指针传递。

  • 变量是一个大的结构
    如果变量是一个大的结构,性能是一个问题,最好是通过指针传递变量。这样可以避免在内存中复制整个结构。

  • 变量是一个map或slice
    Go中的map和slice是引用类型,应该通过值传递。

对于第三方函数,我们要根据其具体形式确定,我们传递的参数应该是指针(即指向原始数据的地址)还是原始数据值。比如,如果函数要对实参数据进行修改,但是并没有返回新的原始数据对象,则需要传指针,比如json中的decode和encode函数等。

参考链接:https://www.jianshu.com/p/759b28a2552c

你可能感兴趣的:(go)