匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Golang之参数传递:值传递和引用传递

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