2022年10月更文挑战4-golang之值传递和引用传递

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

golang之值传递和引用传递

前文

本文内容为对于golang中值传递及引用传递的一些理解。内容结合了对于相关知识的总结整理以及本人的思路想法,其中可能存在偏差之处。

golang的值传递

golang的值传递,是指在函数的调用过程中,将实际的参数进行一次复制,复制到函数的形参上。这样实际传入的参数与函数中所使用的形参,也就是两个不同的内存地址中的对象。这样在函数体内对于对象的操作,实际并不对原始的对象产生影响。

var ii int = 0
func main(){
   add(ii)
   time.Sleep(10000)
}
func add(i int){
   i++
   fmt.Println(i)
}

如上面的代码就是一个值传递的例子。我们传入到函数中的变量会进行变量的复制, 函数中对于变量i的操作,并不会影响原始变量ii的信息。也就是进行了一次变量复制。

golang的引用传递

引用传递则是在函数进行调用时,将调用参数的内存地址传递到函数中。所以在函数中进行变量值的修改时,操作的是内存地址,将会影响到实际参数。正常情况下我们需要手动进行获取指针作为实际的引用传递。

var ii int = 0
func main(){
   add(&ii)
   time.Sleep(10000)
}
func add(i *int){
   (*i)++)
}

上面的代码传递的就是内存的地址,函数内的逻辑会影响原始变量的值。

一些特殊类型的传递

针对于常规已知的引用类型,例如slice、map、interface等等,他们本身就是指针。也就是在进行函数的传递时,传递的就是他们底层对象的指针,自然也就是函数内部指向原始的底层数据结构。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。