一架梯子,一头程序猿,仰望星空!
Golang初级特性面试题 > 内容正文

Golang为什么传参使用切片而不使用数组?


问题简答

Go里面的数组是值类型,切片是引用类型,引用类型作为参数,可以避免深拷贝,效率比较高。

问题详解:

在函数传参的时候使用值传递的优点是函数内部修改参数值,不会对函数外部造成影响,因为值传递,函数内部拿到的变量是一个新的副本数据。

因此在如下例子中两次打印的指针地址是不一样的

package main

import "fmt"

// 定义参数为数组类型
func test (x [2]int) {
    fmt.Printf("%p \n", &x)  // 0xc0000b2010
}

func main() {
    // 定义一个数组
    arr := [2]int{1,2}
    fmt.Printf("%p \n", &arr) // 0xc0000b1020
    test(arr)
}

值传递的缺点是效率不高,如果传递一个byte数组,有1G那么大,那拷贝这个变量的速度肯定很慢。

而引用类型,则没有这个拷贝的过程,实参与形参指向的是同一块内存地址(实际上拷贝的是指针地址,这个指针地址指向同一块内存)

package main

import "fmt"

// 定义参数为切片类型
func test (x []int) {
    fmt.Printf("%p \n", x)
}

func main() {
    // 定义一个切换
    arr := make([]int, 0)
    fmt.Printf("%p \n", arr)
    test(arr)
}

提示:引用类型作为函数参数的副作用就是函数内部如果修改了数组数据,函数外部也会受到影响。