go中值传递和引用传递的区别

1. 数据传递本质

 

  • 值传递:
    • 在值传递过程中,函数会创建参数的一个副本,并将副本传递给函数。这意味着函数内部对参数的操作是在这个副本上进行的,并不会影响到原始数据。
    • 例如,当传递一个整数、字符串或结构体等基本类型或复合类型的值给函数时,函数接收到的是该值的一份拷贝。
  • 引用传递:
    • 引用传递并非 Go 语言中函数参数传递的默认方式(Go 语言没有像 C++ 那样的引用传递语法),但可以通过指针来实现类似的效果。
    • 当使用指针传递参数时,函数接收的是变量的内存地址,也就是对原始变量的一个引用。函数内部通过这个指针可以直接访问和修改原始变量的值,所以在函数内部对指针所指向的值进行操作会影响到原始数据。

2. 内存使用情况

 

    • 值传递:
      • 由于要创建参数的副本,所以在值传递时会占用额外的内存空间,尤其是对于大型的数据结构,创建副本可能会消耗较多的内存资源。
      • 例如,如果传递一个包含大量元素的数组作为值传递,那么函数会在内存中另外开辟一块空间来存储这个数组的副本。
    • 引用传递(通过指针):
      • 传递指针只需要传递变量的内存地址,通常地址的大小是固定的(在 64 位系统中一般为 8 字节),相较于传递大型数据结构的副本,占用的内存空间要少得多。
      • 例如,不管是指向一个整数还是一个大型结构体的指针,传递时占用的内存基本就是指针本身的大小,而不是整个被指向数据结构的大小。
posted @ 2024-11-29 14:41  仁义礼智信的  阅读(41)  评论(0)    收藏  举报