<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一篇文章帶你了解Go語言基礎(chǔ)之切片

          共 4180字,需瀏覽 9分鐘

           ·

          2022-04-07 17:44

          點擊上方“Go語言進階學習”,進行關(guān)注

          回復“Go語言”即可獲贈Python從入門到進階共10本電子書

          朝避猛虎,夕避長蛇;磨牙吮血,殺人如麻。

          ????上篇文章中我們學習了Go語言基礎(chǔ)中的變量,一篇文章帶你了解Go語言基礎(chǔ)之變量,這篇文章我們繼續(xù)介紹Go語言基礎(chǔ)知識,今天跟大家分享的是基礎(chǔ)數(shù)據(jù)類型之切片,一起來學習下吧~


          前言

          Hey,大家好呀,我是星期八,這次咱們繼續(xù)學習Go基礎(chǔ)之切片扒。


          為什么需要切片

          在原來的時候,我們學過數(shù)組,我們知道數(shù)組是可以存儲很多東西的。

          代碼

          package main
          import "fmt"
          func main() { var student_list = [4]string{"張三""李四""王五,""小劉"} fmt.Println(student_list)}

          上述代碼定義了一個數(shù)組,并且存了4個值,但是如果存5個值或者更多呢。

          package main
          import "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 main
          import "fmt"
          func main() { var student_list = []string{"張三""李四"} //[]里面沒有加長度是切片 var student_list2 = [3]string{"張三""李四""王五"} //[]里面加長度是數(shù)組 fmt.Printf("%p\n", student_list) //結(jié)果:0xc000096440 fmt.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 []string var student_list2 []int var student_list3 []float64 //類型推斷方式,后面必須帶{},數(shù)組同理 var student_list4 = []string{}}

          方式二(make方式)

          語法:var 變量名 = make([]存儲類型, 切片中元素數(shù)量, 切片的容量)變量名 := make([]int1020)/*    切片容量不寫等于切片元素數(shù)量*/
          例如:package main
          import "fmt"
          func main() { var student_list4 = make([]int1020) fmt.Println(student_list4)//結(jié)果:[0 0 0 0 0 0 0 0 0 0]}


          由數(shù)組得到的切片

          注:數(shù)組得到的,只能是切片

          package main
          import "fmt"
          func main() { var name_array = [5]int{12345} 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 main
          import "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 main
          import "fmt"
          func main() { //var student_list []string var student_list1 = []string{"張三""李四""王五""小劉"} var student_list2 = make([]string10) 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 main
          import "fmt"
          func main() { var names = []string{"張三""李四"} names[1] = "李四666" //修改下標為1的值 fmt.Println(names) //[張三 李四666]}


          刪除切片中的元素(刪)

          比較尷尬的是,Go中的切片,在做刪除這個操作,不是太友好。

          下面舉個例子,希望能看懂,看不懂會用就行。

          package main
          import "fmt"
          func main() { var names = []string{"張三""李四""王五""小劉""七阿"} //刪除索引為2的元素 names = append(names[:2], names[3:]...) //刪除王五 fmt.Println(names) //[張三 李四 小劉 七阿]}

          如果看不懂,沒關(guān)系,下章會好好捋捋這個。


          切片遍歷(查)

          切片的遍歷同數(shù)組一樣。

          package main
          import "fmt"
          func main() { var names = []string{"張三""李四""王五""小劉""七阿"} //方式一,標準for循環(huán) for i := 0; i < len(names); i++ { fmt.Println(names[i])} //方式二,for range for index, value := range names { //index為下標,value為值 fmt.Println(index, value) }}


          總結(jié)

          上述我們學習了Go基礎(chǔ)之切片。如果在操作過程中有任務問題,記得在下面的討論區(qū)留言,我們看到會第一時間解決問題。

          我是碼農(nóng)星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。

          -------------------?End?-------------------

          歡迎大家點贊轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入學習群請在后臺回復【入群

          萬水千山總是情,點個【在看】行不行

          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲人成高清 | 韩国一区不卡 | 国产一级精品成人无码毛片 | 激情五月天激情网 | 久操久|