作家
登录

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

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

运行结不雅:

这里为什么改变了切片的内容呢?

什么是标头?

搞清跋扈这个问题,起重要知道什么是“标头”这个概念?引用《Go说话实践》中的一段话:

Go 说话里的引用类型有如下几个:切片、映射、通道、接口和函数类型。当声明上述类型的变量时,创建的变量被称作标头(header)值。大年夜技巧细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据构造的指针。因为标头值是为复制而设计的,所以永远不须要共享一个引用类型的值。标头值里包含一个指针,是以经由过程复制来传递一个引用类型的值的副本,本质上就是在共享底层数据构造。

[zhang si]

总而言之,引用类型在函数传递的时刻,是值传递,只不过这里的“值”指的是标头值。

我们分别打印这个切片变量传参前后的指针地址,和传参前后切片中元素的指针地址:

运行结不雅:

0xc42000a060

0xc42000a090

0xc42000a0a0

0xc42000a090

这再次证清楚明了切片传递的不是指针地址,因为变量前后地址不合。


这也证清楚明了切片的参数传递的是传值的情势,具体是传标头值的拷贝,因为指向元素的指针地址雷同。

  1. package main 
  2.   
  3. import ( 
  4.     "fmt" 
  5.   
  6. func main() { 
  7.     slice1 := []string{"zhang""san"
  8.     fmt.Printf("%p\n", &slice1) 
  9.     fmt.Printf("%p\n", &slice1[1]) 
  10.     modify(slice1) 
  11.     fmt.Println(slice1) 
  12.   
  13. func modify(data []string) { 
  14.     fmt.Printf("%p\n", &data) 
  15.     fmt.Printf("%p\n", &data[1]) 
  16.     data[1] = "si" 

【编辑推荐】

  1. 描述硬盘特点的两个参数有什么不合?
  2. 存储阵列硬件参数中的哪一些是关键值
  3. 这些硬盘参数你都懂得吗?
  4. 这些硬盘参数你都懂得吗?(下篇)
  5. 若何选择高机能的存储产品
【义务编辑:武晓燕 TEL:(010)68476606】

  推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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