在函数传参的时候使用值传递的优点是函数内部修改参数值,不会对函数外部造成影响,因为值传递,函数内部拿到的变量是一个新的副本数据。
因此在如下例子中两次打印的指针地址是不一样的
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)
}
提示:引用类型作为函数参数的副作用就是函数内部如果修改了数组数据,函数外部也会受到影响。