Golang之参数传递:值传递和引用传递
在Golang中,函数的参数可以通过值传递或引用传递来传递。本文将对这两种参数传递方式进行详细介绍,并解释它们在Golang中的工作方式。
一、值传递
值传递是指将参数的值复制一份后传递给函数的过程。在函数内部,对参数的任何修改都只会在函数内生效,对外部的调用者没有任何影响。
示例代码1:
```
package main
import "fmt"
func main() {
x := 1
fmt.Println("传递前:", x)
addOne(x)
fmt.Println("传递后:", x)
}
func addOne(a int) {
a += 1
fmt.Println("函数内部:", a)
}
```
输出结果:
```
传递前: 1
函数内部: 2
传递后: 1
```
可以看到,在函数addOne中对参数a的修改没有对外部的x变量产生影响。
二、引用传递
引用传递是指将参数的地址传递给函数,函数对地址指向的值进行修改后,外部函数所指向的值也被修改。
示例代码2:
```
package main
import "fmt"
func main() {
x := 1
fmt.Println("传递前:", x)
addOne(&x)
fmt.Println("传递后:", x)
}
func addOne(a *int) {
*a += 1
fmt.Println("函数内部:", *a)
}
```
输出结果:
```
传递前: 1
函数内部: 2
传递后: 2
```
可以看到,函数addOne中对参数a进行修改后,外部x变量的值也被修改了。
三、结构体的传递
除了基本数据类型和指针类型的参数,结构体也可以通过值传递和引用传递来传递。
示例代码3:
```
package main
import "fmt"
type person struct {
name string
age int
}
func main() {
p1 := person{name: "张三", age: 18}
fmt.Println("传递前:", p1)
changeAge(p1)
fmt.Println("传递后:", p1)
}
func changeAge(p person) {
p.age += 1
fmt.Println("函数内部:", p)
}
```
输出结果:
```
传递前: {张三 18}
函数内部: {张三 19}
传递后: {张三 18}
```
可以看到,函数changeAge中对参数p进行的修改没有影响到外部p1的属性值。
示例代码4:
```
package main
import "fmt"
type person struct {
name string
age int
}
func main() {
p1 := person{name: "张三", age: 18}
fmt.Println("传递前:", p1)
changeAge(&p1)
fmt.Println("传递后:", p1)
}
func changeAge(p *person) {
p.age += 1
fmt.Println("函数内部:", *p)
}
```
输出结果:
```
传递前: {张三 18}
函数内部: {张三 19}
传递后: {张三 19}
```
可以看到,在函数changeAge中对参数p进行的修改影响到了外部p1的属性值。
四、总结
在Golang中,函数的参数可以通过值传递或引用传递来传递。对于基本数据类型和指针类型的参数,值传递和引用传递的效果很明显。对于结构体类型的参数,需要注意到传递方式对参数的影响。如果需要在函数内部修改结构体参数的属性值,应该使用引用传递来传递参数。