值传递
值传递:当将变量传递给函数时,实际上传递的是变量的副本(数据的拷贝)。因此,在函数内对这个副本所做的任何修改都不会反映到原始变量上。在值传递中,由于传递的是数据副本,所以原始数据在内存中的值保持不变。
实际上,Go语言只有值传递,每当传递一个变量作为参数时,传递的是在内存新拷贝的一个变量。
可以用一个例子来验证值传递的过程:
package main
import "fmt"
// 定义一个函数,接收一个int类型的参数
func square(num int) {
// 在函数内修改参数的值
num *= num
fmt.Println("Inside square function:", num)
}
func main() {
original := 4
fmt.Println("Before square function:", original)
// 调用square函数,传入original变量
square(original)
// 输出调用函数后的original变值,可以看到值没有变化,说明传递的是副本
fmt.Println("After square function:", original)
}
可以看到,函数内部对变量的改动是不会影响原变量的:
引用传递
package main
import "fmt"
// 定义一个函数,它接收一个指向int的指针类型参数
func square(num *int) {
// 通过解引用修改原始变量的值
*num *= *num
fmt.Println("Inside square function:", *num)
}
func main() {
original := 4
fmt.Println("Before square function:", original)
// 传递original变量的地址到square函数
square(&original)
// 输出调用函数后的original变量的值,可以看到值改变了,说明传递的是引用
fmt.Println("After square function:", original)
}
原文始发于微信公众号(赛博安全狗):【开发内功】Go的值传递和指针传递
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论