Go语言当中值传递和地址传递(引用传递) 如何运用?有什么区别?举例说明
Go语言当中值传递和地址传递(引用传递) 如何运用?有什么区别?举例说明
- 值传递只会把参数的值复制一份放进对应的函数,两个变量的地址不同, 不可相互修改。
- 地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变 量进行值内容的修改。
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中,由于内存安全和性能优化的考虑,推荐使用值传递作为默认选择,当确实需要修改外部变量时,再考虑使用地址传递。