<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
切片區別於陣列,是參照型別, 不是值型別。陣列是固定長度的,而切片長度是可變的,我的理解是:切片是對陣列一個片段的參照。
var s1 []int //定義一個存放int型別元素的切片 var s2 []string //定義一個存放string型別元素的切片 fmt.Println(s1, s2) fmt.Println(s1 == nil) //true 為空 沒有開闢記憶體空間 fmt.Println(s2 == nil) //true
列印結果:
解析: 說明我們已經宣告定義成功了,但是並沒有開闢記憶體空間,因為s1、s2的值為nil
我們可以在定義的同時初始化
var s1 = []int{1, 2, 3} var s2 = []string{"北苑", "長陽", "望京"} fmt.Println(s1, s2) fmt.Println(s1 == nil) //false fmt.Println(s2 == nil) //false
列印結果:
解析: 初始化成功,s1 s2的值都不等於nil
分別使用len()、cap()獲得切片的長度和容量
fmt.Printf("len(s1):%d cap(s1):%dn", len(s1), cap(s1)) fmt.Printf("len(s2):%d cap(s2):%dn", len(s2), cap(s2))
列印結果:
解析: 和我們預期的一致,長度和容量都為3
開篇我已經提到陣列和切片的關係,這裡在進一步講一下:
//定義一個陣列 a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} s3 := a1[0:4] //基於一個陣列切割 [0:4]左包含 右不包含 即為[1,2,3,4] fmt.Println(s3)
列印結果:
注意:a1[0:4] 基於一個陣列切割 [0:4]左包含 右不包含 即為[1,2,3,4]
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} s4 := a1[2:4] //[3 4] s5 := a1[:4] //[1 2 3 4] s6 := a1[2:] //[3 4 5 6 7 8 9] s7 := a1[:] //[1 2 3 4 5 6 7 8 9] fmt.Println(s4) fmt.Println(s5) fmt.Println(s6) fmt.Println(s7)
列印結果:
解析: 都符合上面提到的左包含,右不包含
原則 s4從下標2開始擷取,擷取到下標4 s5省略了第一個引數,表示從下標0開始擷取 s6省略了第二個引數,表示擷取到最後一個元素 s7省略了兩個引數,只填寫了中間的冒號:,表示取全部元素
切片的長度很好理解,就是元素的個數
切片的容量我們重點理解一下:在切片參照的底層陣列中從切片的第一個元素到陣列最後一個元素的長度(元素數量)
這麼讀起來可能有點抽象,我們看下面這個栗子就很好理解啦:
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} s5 := a1[:4] //[1 2 3 4] s6 := a1[2:] //[3 4 5 6 7 8 9] s7 := a1[:] //[1 2 3 4 5 6 7 8 9] fmt.Printf("len(s5):%d cap(s5):%dn", len(s5), cap(s5)) //4 9 fmt.Printf("len(s6):%d cap(s6):%dn", len(s6), cap(s6)) //7 7 fmt.Printf("len(s7):%d cap(s7):%dn", len(s7), cap(s7)) //9 9
列印結果:
解析: a1是陣列長度為9,容量也為9,值是從1~9
s5/s6/s7都是切割陣列a1得到的切片。
s5的長度為4,因為只有1 2 3 4這4個元素,容量為9,因為s5切片的第一個元素是1,而s5底層陣列a1最後一個元素是9,1~9共9個元素,所以s5的容量為9。
s6的長度為7,因為s6的元素是39這7個元素;容量也為7,因為s5的底層陣列最後一個元素是9,39共7個元素,所以s6的容量為7。
S7更好理解了,長度和容量都是9,小夥伴們自己理解一下。
我們可以對切片進行再切片操作
比如,我們針對上面的資料再次切片進行測試
s8 :=s6[3:] fmt.Printf("len(s8):%d cap(s8):%dn", len(s8), cap(s8)) //4 4
列印結果:
解析:我們知道可以對切片進行再次切片就可以,至於長度和容器大家搞明白上面的栗子,這個輸出結果就是意料之中的了。
我們舉個栗子來證明切片是參照型別
//定義陣列 a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} //有陣列切割成切片s6 s6 := a1[2:] //[3 4 5 6 7 8 9] //切片再次切片,賦值給s8 s8 :=s6[3:] //[6 7 8 9] //修改原始陣列,把下標為2的值由3改為333 a1[2] = 333 //列印s6,發現s6中的3也變成了333 fmt.Println("s6:", s6) //[333 4 5 6 7 8 9] //因為s8基於s6切片而成,我們測試一下切片再切片的參照傳的 fmt.Println("s8:", s8) //[6 7 8 9] //我們把原始陣列下標為5的值由6改為666 a1[5] = 666 //列印s8切片,得到結果6也變成了666 fmt.Println("s8:", s8) //[666 7 8 9]
列印結果:
解析: 由此我們可以明確的知道切片是參照型別,當底層陣列改變時,不管是切片,還是切片再切片,值都會改變。因為他們使用的是一個記憶體塊,參照的一個記憶體地址。
這篇文章介紹了切片的特點,如何定義切片,如果由陣列切割切片,切片的參照型別特徵,更多關於Go slice切片的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45