您现在的位置是:自如初>Go基础Go基础

23、Go 函数- 参数的值传递与引用传递

温新 2023-08-29 23:54:58 Go基础 106人已围观

简介Go 语言中,函数参数的传递可以分为 按值传递 和 按引用传递。

hi,我是温新

Go 语言中,函数参数的传递可以分为 按值传递按引用传递

Go 语言中,默认是按值传递

按值传递:指在调用函数时将实际参数复制一份到函数中,那么在函数中对参数所进行的修改不会影响到实际参数

按引用传递:指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改将会影响实际参数

到这里应该明白,想要函数直接修改参数的值,就需要使用引用传递。

引用传递的语法

引用传递地址,在变量名前加上 & 符号,如此就是引用传递了。此时传递参数的不再是值而是指针(也就是内存地址)。


需要注意的是,如果把指针传递给函数,指针的值就会被复制(指针的值就是内存地址),指针只复制地址而不会复制值。如变量 a,和 变量 b = &a,此时变量 b 的值是变量 a 的内存地址。修改变量 b 指针的值,那么变量 a 的值也就被修改了。

值传递与引用传递案例

package main

import "fmt"

func main() {
   x := 1
   fmt.Println("x =", x, ";函数内存地址为 &x =", &x)

   // 值传递
   y := add(x)
   fmt.Println("x = ", x, "; y = ", y, "; 地址为 &y = ", &y)

   // 引用传递
   // 引用传递通过 & 符号把地址传递给函数
   z := add1(&x)
   fmt.Println("x =", x, "z =", z, "&z =", &z)
}

// 值传递
func add(num int) int {
   // 操作变量副本的值
   num++

   return num
}

// 引用传递
// 函数接收引用传递的地址时,使用 * 取出地址的值
func add1(num *int) int {
   // 操作内存地址的值
   *num++

   return *num
}

输出结果为

x = 1 ;函数内存地址为 &x = 0xc00001a0a8
x = 1 ; y =  2 ; 地址为 &y =  0xc00001a0c8
x = 2 z = 2 &z = 0xc00001a0e0

通过案例可以看到:

1、使用值传递时,变量 x 和 y 的内存地址是一样的,而修改 y 的值时,不会影响到 x 的值;

2、使用引用传递时,变量 x 和 z 的内存地址不一样,而修改 z 的值时,会影响的 x 的值,原因是 指针变量 z 的值存储的是变量 x 的内存地址。

引用传递的优势

1、使得多个函数可以操作同一个对象;

2、传递指针比较轻量级,可以使用指针传递体积大的解构体;在函数调用时 像切片 lic )、 字典( map 接口 interface )、通道( channel )这样的 引用 类型 是默 使用引用传递 的(即使没有显式地指出指针);

3、传递指针给函数不但可以节省内存,还能赋予函数直接修改外部变量的能力,因此被修改的变量不再需要使用 return 返回,案例如下:

package main

import "fmt"

func main() {
   num := 0
   result := &num
   noReturn(2, 2, result)
   fmt.Println("结果: ", *result)
}

func noReturn(m, n int, res *int) {
   *res = m * n
}

很赞哦!(3)

文章评论

登录 注册

自如初--时间轴

站名:自如初

独白:向前走!向前走!

邮箱:ziruchu@qq.com

RSS: RSS

站点信息