内容简介:如果改变了原本的值,切片的值也会跟着变,如果改变了切片的值,原本的值也会跟着变,所以有指针特性。
总结
如果改变了原本的值,切片的值也会跟着变,
如果改变了切片的值,原本的值也会跟着变,
所以有指针特性。
go语言的slice是并不是纯引用类型,而是一种包含指针的聚合类型,类似
type IntSlice struct{
ptr *int
len int
cap int
}
因为类似struct,所以还是值传递
样例1·
测试程序
package main
import "fmt"
func main(){
a :=[...]int{0,1,2,3,4,5,6,7,8,9}
fmt.Println(a)
s1:=a[:]
s2:=s1[:]
fmt.Println(s1)
fmt.Println(s2)
fmt.Println("")
fmt.Println("-------------------------------")
fmt.Println("")
a[9]=10
s2[0]=100
fmt.Println(a)
fmt.Println(s1)
fmt.Println(s2)
}
输出
[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9] ------------------------------- [100 1 2 3 4 5 6 7 8 10] [100 1 2 3 4 5 6 7 8 10] [100 1 2 3 4 5 6 7 8 10]
分析
0全变100了
9全变10了
样例2
测试程序
package main
import "fmt"
func add1(s []int,x int) []int{
s=append(s,x);
return s
}
func add2(s []int,x int){
s=append(s,x);
}
func main(){
a :=[...]int{0,1,2,3,4,5,6,7,8,9}
fmt.Println(a)
s1:=a[5:8]//len=3 cap=5
fmt.Println(s1)
add2(s1,0)
fmt.Println(a)
fmt.Println(s1)
add2(s1,1)
fmt.Println(a)
fmt.Println(s1)
}
输出
[0 1 2 3 4 5 6 7 8 9] [5 6 7] [5 6 7] [0 1 2 3 4 5 6 7 0 9] [5 6 7] [0 1 2 3 4 5 6 7 1 9]
分析
数组的 8依次变成了 0、1
但slice s1始终没变
说明slice并不是纯引用类型
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
機器,平台,群眾
安德魯‧麥克費(Andrew McAfee)、艾瑞克‧布林優夫森(Erik Brynjolfsson) / 李芳齡 / 天下文化 / 2017-12-27 / TWD550
★★Amazon.com商業理財Top1 ★★ 全球暢銷書《第二次機器時代》作者最新力作 兩位MIT數位頂尖科學家歷時三年時間 走訪矽谷、華府、劍橋、紐約、倫敦、舊金山等科技政經重鎮 拜會許多領域精英進行交流,結合宏觀趨勢觀察, 指出人人都應關注的三重革命 科技正以空前速度改變每個產業及每個人的生活, 你該如何做,才能保持領先? 我們生活在一個奇特的......一起来看看 《機器,平台,群眾》 这本书的介绍吧!