【开发内功】Go的值传递和指针传递

admin 2024年2月7日19:45:18评论14 views字数 1115阅读3分43秒阅读模式
【开发内功】Go的值传递和指针传递

值传递

【开发内功】Go的值传递和指针传递

值传递:当将变量传递给函数时,实际上传递的是变量的副本(数据的拷贝)。因此,在函数内对这个副本所做的任何修改都不会反映到原始变量上。在值传递中,由于传递的是数据副本,所以原始数据在内存中的值保持不变。

实际上,Go语言只有值传递,每当传递一个变量作为参数时,传递的是在内存新拷贝的一个变量。

可以用一个例子来验证值传递的过程:

package mainimport "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)}

可以看到,函数内部对变量的改动是不会影响原变量的:

【开发内功】Go的值传递和指针传递

【开发内功】Go的值传递和指针传递

引用传递

【开发内功】Go的值传递和指针传递
引用传递:当将变量传递到函数时,实际上传递的是对变量内存地址的引用(即指针)。因此,函数内对参数值的任何修改都将影响到原始变量,因为它们指向同一块内存地址。在引用传递中,函数内外的变量实际上是同一个数据结构的不同别名。
Go中实现引用传递通常通过使用指针。指针是一个存储另一变量内存地址的变量。当你通过指针传递变量到函数时,你实际上是传递了这个变量地址的副本,因此函数内部能够通过这个地址来修改原始变量的值。
可以用一个例子来验证指针传递的过程:
package mainimport "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的值传递和指针传递

原文始发于微信公众号(赛博安全狗):【开发内功】Go的值传递和指针传递

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月7日19:45:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【开发内功】Go的值传递和指针传递http://cn-sec.com/archives/2478546.html

发表评论

匿名网友 填写信息