Golang 数组的传递


Golang 数组的传递

概念介绍

数组与切片

​ 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。数组长度最大为2Gb,它是值类型。切片是对数组一个连续片段的引用,所以切片是一个引用类型。

按值传递和按引用传递

​ Go语言中函数的参数有两种传递方式,按值传递和按引用传递。Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。
​ 按引用传递其实也可以称作”按值传递”,只不过该副本是一个地址的拷贝,通过它可以修改这个值所指向的地址上的值。
​ Go语言中,在函数调用时,引用类型(slice、map、interface、channel)都默认使用引用传递。

数组传递时的缺点

​ 一般情况下,传递指针的消耗比传递副本的少,尤其是当数组特别大时。具体原因是:

  1. 值传递需要完整的复制初始数组并将这份拷贝放到栈中,这将耗费大量运行时间,因而值传递方式的效率比较低。

  2. 初始数组的拷贝需要占用额外的内存空间(栈中的内存)。

  3. 编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。

如何避免

​ 如上面介绍的,有两种方法,第一种利用指针,即引用传递;第二种使用切片,因为切片是引用类型,默认会使用引用传递。

使用指针进行传递

package main

import "fmt"

func main() {
    var arr = [5]int{1, 2, 3, 4, 5}
    fmt.Println(sum(&arr))
}

func sum(arr *[5]int) int {
    s := 0
    for i := 0; i < len(arr); i++ {
        s += arr[i]
    }
    return s
}

使用切片进行传递

package main

import "fmt"

func main() {
    var arr = [5]int{1, 2, 3, 4, 5}
    fmt.Println(sum(arr[:]))
}

func sum(arr []int) int {
    s := 0
    for i := 0; i < len(arr); i++ {
        s += arr[i]
    }
    return s
}

最后一种方法通常比较常用。
————————————————
版权声明:本文为CSDN博主「benben_2015」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/benben_2015/java/article/details/80884537


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM