Go语言当中值传递和地址传递(引用传递) 如何运用?有什么区别?举例说明

发布于 1周前 作者 ionicwang 最后一次编辑是 5天前 来自 问答

Go语言当中值传递和地址传递(引用传递) 如何运用?有什么区别?举例说明

  1. 值传递只会把参数的值复制一份放进对应的函数,两个变量的地址不同, 不可相互修改。
  2. 地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变 量进行值内容的修改。

Go语言值传递

package main  
  
import "fmt"  
  
func modifyValue(x int) {  
    x = 10 // 修改的是x的副本  
}  
  
func main() {  
    y := 5  
    modifyValue(y)  
    fmt.Println(y) // 输出: 5,y的值没有改变  
}

Go语言地址传递(引用传递)

package main  
  
import "fmt"  
  
func modifyPointer(x *int) {  
    *x = 10 // 修改的是x指向的值  
}  
  
func main() {  
    y := 5  
    modifyPointer(&y) // 传递y的地址  
    fmt.Println(y) // 输出: 10,y的值被修改了  
}
1 回复

Go语言中的值传递与地址传递(引用传递)

在Go语言中,函数参数的传递方式主要是值传递,但通过传递指针(即地址),可以达到类似引用传递的效果。这两种方式在Go中的使用场景和区别如下:

值传递

  • 特点:在调用函数时,会将实参的副本(值)传递给形参。函数内部对形参的任何修改,都不会影响到实参。
  • 适用场景:当不希望函数修改原始数据时,使用值传递。
  • 示例
package main

import "fmt"

func modifyValue(x int) {
    x = 100 // 修改的是x的副本,对外部变量无影响
}

func main() {
    a := 5
    modifyValue(a)
    fmt.Println(a) // 输出: 5
}

地址传递(通过指针)

  • 特点:在调用函数时,传递的是实参的内存地址(指针)。函数内部通过指针可以访问并修改实参的值。
  • 适用场景:当需要在函数内部修改原始数据时,使用地址传递。
  • 示例
package main

import "fmt"

func modifyPointer(x *int) {
    *x = 100 // 修改的是x指向的值,即实参的值
}

func main() {
    a := 5
    modifyPointer(&a) // 传递a的地址
    fmt.Println(a) // 输出: 100
}

区别总结

  • 值传递:在函数内部操作的是参数的副本,不会影响到外部的实际参数。
  • 地址传递(通过指针):在函数内部操作的是参数的内存地址指向的值,可以直接修改外部的实际参数。

选择哪种传递方式,主要取决于你的具体需求和场景。在Go中,由于内存安全和性能优化的考虑,推荐使用值传递作为默认选择,当确实需要修改外部变量时,再考虑使用地址传递。

回到顶部