在 Go 语言中,传递参数时是否需要加上 &
符号取决于参数的类型以及函数或方法的定义。&
符号用于获取变量的地址,即取得变量的指针。让我们通过几个示例来说明加和不加 &
符号的区别。
示例 1:传递基本类型参数
package main
import "fmt"
// 函数 addOne 用于增加传入的整数值的基础上加1
func addOne(x int) {
x = x + 1
}
func main() {
num := 5
// 传递 num 的值给 addOne 函数
addOne(num)
// num 的值并没有改变
fmt.Println("num after addOne:", num) // 输出:num after addOne: 5
}
在这个例子中,addOne
函数中的参数 x
是一个整数类型的变量。当我们调用 addOne(num)
时,num
的值被复制给了 x
,在函数内部对 x
的操作不会影响到 num
的值,因此 num
的值仍然是 5。
示例 2:传递指针类型参数
package main
import "fmt"
// 函数 addOne 使用指针参数,通过指针修改传入的整数值
func addOnePtr(x *int) {
*x = *x + 1
}
func main() {
num := 5
// 传递 num 的地址给 addOnePtr 函数
addOnePtr(&num)
// num 的值被修改了
fmt.Println("num after addOnePtr:", num) // 输出:num after addOnePtr: 6
}
在这个例子中,addOnePtr
函数的参数 x
是一个 *int
类型的指针。当我们调用 addOnePtr(&num)
时,我们传递了 num
的地址给 addOnePtr
函数,使得函数内部可以直接修改 num
的值。因为 x
是 num
的指针,通过 *x
可以获取到 num
的值,并修改它。因此,最后打印 num
的值为 6。
总结:
-
如果函数或方法的参数是基本类型(如
int
、string
、bool
等),传递时不需要加&
符号。这样会将值复制给函数的参数,函数内部的修改不会影响到原始值。 -
如果函数或方法的参数是指针类型(如
*int
、*string
等),则需要在传递时加上&
符号,以获取变量的地址,使得函数内部可以通过指针直接修改原始值。
这种区别在 Go 中非常重要,因为它影响了参数传递时是否进行值复制,以及是否能够在函数内部修改原始变量的值。
网友评论