传值——指针
所有的形参都是以传值的方式传入,所以对形参做的任何改变都不会影响实参。例如:
func myFunc(a, b int) int {
a = 1
return a + b
}
函数中对形参a的赋值语句,对实参没有任何影响。就是说
x, y := 2, 3
var sum = myFunc(x, y)
fmt.Println(sum, x)
显示结果是4和2。x的值没有变化。
如果想要改变实参的值,就需要传入指针(译注:即传地址或传引用)作为参数。例如,变更函数定义如下:
func myFunc(a *int, b int) int {
*a = 1
return *a + b
}
参数a以指针的形式传入,对a的赋值语句改变a指向的变量。调用函数时,我们需要传入变量的地址作为参数:
var sum = myFunc(&x, y)
fmt.Println(sum, x)
现在显示结果是4和1,x的值变更了。
*和&操作符的用法对C程序员来说是非常熟悉的,这体现了Go语言较为初级的一面。有争议说在现代语言中所有的参数都应该以传引用的方式传入。
如果函数定义中的参数是*int类型,而调用该函数时没有使用&操作数,那么在编译阶段类型检查时就会报错,而C语言没有这个功能。
总之,Go语言的指针类型,可以作为实参传递给函数,但无法在数据上耍一些”聪明“的技巧。