运行结不雅:
这里为什么改变了切片的内容呢?
什么是标头?
搞清跋扈这个问题,起重要知道什么是“标头”这个概念?引用《Go说话实践》中的一段话:
Go 说话里的引用类型有如下几个:切片、映射、通道、接口和函数类型。当声明上述类型的变量时,创建的变量被称作标头(header)值。大年夜技巧细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据构造的指针。因为标头值是为复制而设计的,所以永远不须要共享一个引用类型的值。标头值里包含一个指针,是以经由过程复制来传递一个引用类型的值的副本,本质上就是在共享底层数据构造。
[zhang si]
总而言之,引用类型在函数传递的时刻,是值传递,只不过这里的“值”指的是标头值。
我们分别打印这个切片变量传参前后的指针地址,和传参前后切片中元素的指针地址:
运行结不雅:
0xc42000a060
0xc42000a090
0xc42000a0a0
0xc42000a090
这再次证清楚明了切片传递的不是指针地址,因为变量前后地址不合。
这也证清楚明了切片的参数传递的是传值的情势,具体是传标头值的拷贝,因为指向元素的指针地址雷同。
- package main
- import (
- "fmt"
- )
- func main() {
- slice1 := []string{"zhang", "san"}
- fmt.Printf("%p\n", &slice1)
- fmt.Printf("%p\n", &slice1[1])
- modify(slice1)
- fmt.Println(slice1)
- }
- func modify(data []string) {
- fmt.Printf("%p\n", &data)
- fmt.Printf("%p\n", &data[1])
- data[1] = "si"
- }
【编辑推荐】
- 描述硬盘特点的两个参数有什么不合?
- 存储阵列硬件参数中的哪一些是关键值
- 这些硬盘参数你都懂得吗?
- 这些硬盘参数你都懂得吗?(下篇)
- 若何选择高机能的存储产品
推荐阅读
CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了 体系集成商除了硬件和软件解决筹划之外,还要供给>>>详细阅读
地址:http://www.17bianji.com/lsqh/39458.html
1/2 1