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中,函数的参数可以通过值传递或引用传递来传递。对于基本数据类型和指针类型的参数,值传递和引用传递的效果很明显。对于结构体类型的参数,需要注意到传递方式对参数的影响。如果需要在函数内部修改结构体参数的属性值,应该使用引用传递来传递参数。