一篇文章帶你了解Go語言基礎(chǔ)之切片
回復“Go語言”即可獲贈Python從入門到進階共10本電子書
????上篇文章中我們學習了Go語言基礎(chǔ)中的變量,一篇文章帶你了解Go語言基礎(chǔ)之變量,這篇文章我們繼續(xù)介紹Go語言基礎(chǔ)知識,今天跟大家分享的是基礎(chǔ)數(shù)據(jù)類型之切片,一起來學習下吧~
前言
Hey,大家好呀,我是星期八,這次咱們繼續(xù)學習Go基礎(chǔ)之切片扒。
為什么需要切片
在原來的時候,我們學過數(shù)組,我們知道數(shù)組是可以存儲很多東西的。
代碼
package mainimport "fmt"func main() {var student_list = [4]string{"張三", "李四", "王五,", "小劉"}fmt.Println(student_list)}
上述代碼定義了一個數(shù)組,并且存了4個值,但是如果存5個值或者更多呢。
package mainimport "fmt"func main() {//方式一,在創(chuàng)建的時候就多加一個值// 只能存4個,多了會報錯,array index 4 out of bounds [0:4]//var student_list = [4]string{"張三", "李四", "王五,", "小劉","小七"}//方式二,通過索引方式添加值var student_list = [4]string{"張三", "李四", "王五,", "小劉"}//還是會報錯,invalid array index 4 (out of bounds for 4-element array)//student_list[4] = "小七"fmt.Println(student_list)}
結(jié)論:數(shù)組只能存儲固定長度,不能追加值,如果追加值會報錯。
所以,就引出了以下的一個鏈式存儲結(jié)構(gòu)。
切片
切片,在其他語言中,在Python中叫列表,Java中好像也是列表,PHP中也叫列表,只是在Go中叫切片(slice)
切片(列表)在每個編程語言中,都是一個非常通用的存儲結(jié)構(gòu)。
屬于堆內(nèi)存存儲,其內(nèi)存分布圖如下。

如何驗證。
package mainimport "fmt"func main() {var student_list = []string{"張三", "李四"} //[]里面沒有加長度是切片var student_list2 = [3]string{"張三", "李四", "王五"} //[]里面加長度是數(shù)組fmt.Printf("%p\n", student_list) //結(jié)果:0xc000096440fmt.Printf("%p\n", student_list2) //結(jié)果:%!p([3]string=[張三 李四 王五]),表示不是地址}/*%p表示直接打印的是變量地址如果是棧中存儲的,是打印不出來地址的,顯示%!p,表示不是地址如果是堆中存儲,打印的就直接是地址*/
ps:默認打印,賦值等操作,操作的是棧上面的值,所以堆存儲直接打印的就是堆的地址,賦值等其他操作同理。
開始使用切片
官話
切片(Slice)是一個擁有相同類型元素的可變長度的序列。它是基于數(shù)組類型做的一層封裝。它非常靈活,支持自動擴容。
切片是一個引用類型(堆存儲),它的內(nèi)部結(jié)構(gòu)包含地址,長度和容量。切片一般用于快速地操作一塊數(shù)據(jù)集合。
聲明切片
語法如下。
方式一(聲明變量方式)
語法var 變量名 []存儲類型例如:package main/*和數(shù)組操作方式非常像,[]不加數(shù)字,就是切片*/func main() {var student_list []stringvar student_list2 []intvar student_list3 []float64//類型推斷方式,后面必須帶{},數(shù)組同理var student_list4 = []string{}}
方式二(make方式)
語法:var 變量名 = make([]存儲類型, 切片中元素數(shù)量, 切片的容量)變量名 := make([]int, 10, 20)/*切片容量不寫等于切片元素數(shù)量*/例如:package mainimport "fmt"func main() {var student_list4 = make([]int, 10, 20)fmt.Println(student_list4)//結(jié)果:[0 0 0 0 0 0 0 0 0 0]}
由數(shù)組得到的切片
注:數(shù)組得到的,只能是切片
package mainimport "fmt"func main() {var name_array = [5]int{1, 2, 3, 4, 5}var name_slice = name_array[1:3] //name_array[1:3]切完值以后,結(jié)果只能是切片fmt.Printf("%T %T\n", name_array, name_slice)}
ps:數(shù)組通過下標范圍([開始下標:結(jié)束下標])的方式獲取的值,只能是列表,取值包含左下標,不包含右下標
簡稱顧左不顧右。
向切片中追加元素(增)
終于到了每個語言的必學的環(huán)節(jié)了,切片的增加操作。
在Go中,向切片中追加值,需要用到append。
package mainimport "fmt"func main() {var student_list []string//append追加之后,必須使用student_list再接收student_list = append(student_list, "張三")student_list = append(student_list, "李四")student_list = append(student_list, "王五")fmt.Println(student_list)}
ps:apppend之后,必須使用原來的變量再接受一次
一次性增加多個
如果一個列表,需要增加另外一個列表怎么辦呢???
package mainimport "fmt"func main() {//var student_list []stringvar student_list1 = []string{"張三", "李四", "王五", "小劉"}var student_list2 = make([]string, 10)student_list2 = append(student_list2, "八神") //添加一個值student_list2 = append(student_list2, "八神", "九尾") //可以添加多個值student_list2 = append(student_list2, student_list1...)//下面這種寫法,就是上面...所包含的意思,專業(yè)叫法叫做打散,//student_list2 = append(student_list2,"張三", "李四", "王五", "小劉")fmt.Println(student_list2) //[ 八神 張三 李四 王五 小劉]}
注:可能有人會注意到,八神前面會有很多空格,這個先別著急,后面揭曉。
修改切片中的元素(改)
修改就簡單了,同數(shù)組。
package mainimport "fmt"func main() {var names = []string{"張三", "李四"}names[1] = "李四666" //修改下標為1的值fmt.Println(names) //[張三 李四666]}
刪除切片中的元素(刪)
比較尷尬的是,Go中的切片,在做刪除這個操作,不是太友好。
下面舉個例子,希望能看懂,看不懂會用就行。
package mainimport "fmt"func main() {var names = []string{"張三", "李四", "王五", "小劉", "七阿"}//刪除索引為2的元素names = append(names[:2], names[3:]...) //刪除王五fmt.Println(names) //[張三 李四 小劉 七阿]}
如果看不懂,沒關(guān)系,下章會好好捋捋這個。
切片遍歷(查)
切片的遍歷同數(shù)組一樣。
package mainimport "fmt"func main() {var names = []string{"張三", "李四", "王五", "小劉", "七阿"}//方式一,標準for循環(huán)for i := 0; i < len(names); i++ {fmt.Println(names[i])}//方式二,for rangefor index, value := range names {//index為下標,value為值fmt.Println(index, value)}}
總結(jié)
上述我們學習了Go基礎(chǔ)之切片。如果在操作過程中有任務問題,記得在下面的討論區(qū)留言,我們看到會第一時間解決問題。
我是碼農(nóng)星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。
-------------------?End?-------------------

歡迎大家點贊,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入學習群請在后臺回復【入群】
萬水千山總是情,點個【在看】行不行
