作家
登录

如何理解 Golang 的参数传递都是值传递?

作者: 来源: 2017-12-05 10:24:28 阅读 我要评论

CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了


在 Golang 中函数之间传递变量时老是以值的方法传递的,无论是 int,string,bool,array 如许的内置类型(或者说袈洵始的类型),照样 slice,channel,map 如许的引用类型,在函数间传递变量时,都是以值的方法传递,也就是说传递的都是值的副本。

内置类型参数传递

内置类型传递的时刻是值的副本,这个好懂得,随便举个例子:

  1. package main 
  2.   
  3. import ( 
  4.     "fmt" 
  5.   
  6. func main() { 
  7.     num := 10 
  8.     num2 := increase(num, 10) 
  9.     fmt.Println(num2) 
  10.   
  11. func increase(num intadd intint { 
  12.     return num + add 

这里 num 传入 increase 函数,是拷贝值的副本,并且返回一个新的值。假设 num 是一个很大年夜的数组,那么传递给函数的就是这个很大年夜数组的拷贝。(如许很浪费内存,真实情况如不雅要传一个很大年夜的数组,应当传递数组的指针)

引用类型的参数传递也是值的拷贝。

引用类型的参数传递

例子:

  1. package main 
  2.   
  3. import ( 
  4.     "fmt" 
  5.   
  6. func main() { 
  7.     slice1 := []string{"zhang""san"
  8.     modify(slice1) 
  9.     fmt.Println(slice1) 
  10.   
  11. func modify(data []string) { 
  12.     data = nil 

运行结不雅:

[zhang san]

这个例子证清楚明了作为引用类型的切片,参数传递不是传的引用,而是传的值,如不雅是传的引用,那么函数对它的修改会受到影响,而这里切片内容并没有改变成 nil.

然则有一个例子比较误导人,我们看一看:

  1. package main 
  2.   
  3. import ( 
  4.     "fmt" 
  5.   
  6. func main() { 
  7.     slice1 := []string{"zhang""san"
  8.     modify(slice1) 
  9.     fmt.Println(slice1) 
  10.   
  11. func modify(data []string) { 
  12.     data[1] = "si" 

  13.   推荐阅读

      如何选择高性能的存储产品

    CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了 体系集成商除了硬件和软件解决筹划之外,还要供给>>>详细阅读


    本文标题:如何理解 Golang 的参数传递都是值传递?

    地址:http://www.17bianji.com/lsqh/39458.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)