go 速學 - 07 - Slice

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

目錄

    • 切片 Slice
      • 概念
      • 建立 Slice
        • 定義切片
        • 指定範圍建立切片
        • 使用 make 建立切片
      • len和 cap
      • 遍曆
      • Reslice
      • Append
        • 概念
        • 使用
      • Copy

摘要

切片和數組的區別,建立切片,指定範圍,make,遍曆,reslice,append,copy

切片 Slice

概念

  • 切片本身不是數組,而是指向底層的數組,關聯陣列的局部或全部
  • 切片是參考型別
  • 建立切片時索引不能超過數組的大小,否則會報異常

建立 Slice

定義切片

定義時不用指定長度(指定長度或使用 “…” 表示的是數組)

//切片var s []intfmt.Println(s) //[]//數組var arr [5]intfmt.Println(arr) //[0 0 0 0 0]

指定範圍建立切片

單個索引

a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}s1 := a[9]  //s1 10

左閉右開

s2 := a[5:10]   //s2 [6 7 8 9 10]

從指定索引開始(包含)

s3 := a[5:]     //s3 [6 7 8 9 10]

到指定索引(不包含)

s4 := a[:5]     //s4 [1 2 3 4 5]

使用 make 建立切片

格式

make([]T, len, cap)
make([]T, len)

建立時如果省略 cap,則表示和 len 相同

s5 := make([]int, 3, 10)

len()和 cap()

len() 擷取元素個數,cap() 擷取容量

len(s5)cap(s5)

遍曆

for i, v := range w {    fmt.Println(i, v)}

其中 i 為索引,如果想忽略 i 的使用可以使用預留位置 “_”

//忽略值for i := range w {    fmt.Print(i)}//忽略索引for _, v := range w {    fmt.Print(v)}

Reslice

即指向 Slice 的 Slice

Reslice 時的索引以被 slice 的切片為準

w := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'}fmt.Println("w", w)   //w [97 98 99 100 101 102 103 104 105 106 107]wa := w[2:5]        //wa [99 100 101]wb := wa[3:5]       //wb [102 103]

Append

概念

  • 用於在 slice 尾部追加元素
  • 如果最終長度未超過追加到 slice 的容量則返回原始 slice
  • 如果超過以追加到的 slice 的容量則將重新分配數組並拷貝未經處理資料
  • 當兩個 slice 指向同一個數組時,如果其中一個 slice 超過了容量,那麼再改變它不會影響到另一個 slice,因為此 slice 其實已經指向新的記憶體空間了

使用

文法

resultSlice:=append(originalSlice, ele1, ele2, ele3...)

n1 := make([]int, 3, 6)fmt.Println("n1", n1) //n1 [0 0 0]n2 := append(n1, 1, 2)fmt.Println("n1", n1)                   //n1 [0 0 0]fmt.Println("n2", n2, len(n2), cap(n2)) //n2 [0 0 0 1 2]    5   6//沒有超過原slice 的容量,會影響其它slicen3 := append(n1, 3)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2) //n2 [0 0 0 3 2]fmt.Println("n3", n3) //n3 [0 0 0 3]n4 := append(n1, 4, 5, 6)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2) //n2 [0 0 0 4 5]fmt.Println("n3", n3) //n3 [0 0 0 4]fmt.Println("n4", n4) //n4 [0 0 0 4 5 6]//超過原slice 的容量,指向新地址,不會影響其它slicen5 := append(n1, 7, 8, 9, 10)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2) //n2 [0 0 0 4 5]fmt.Println("n3", n3) //n3 [0 0 0 4]fmt.Println("n4", n4) //n4 [0 0 0 4 5 6]fmt.Println("n5", n5) //n5 [0 0 0 7 8 9 10]

Copy

文法

copy(to,from)

a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}c1 := a[2:5]c2 := a[5:8]fmt.Println("c1", c1) //c1 [3 4 5]fmt.Println("c2", c2) //c2 [6 7 8]copy(c1, c2)fmt.Println("c1", c1) //c1 [6 7 8]fmt.Println("c2", c2) //c2 [6 7 8]

目標切片的容量可以小於源切片的容量

c3 := a[2:3]c4 := a[3:9]fmt.Println("c3", c3) //c3 [6]fmt.Println("c4", c4) //c4 [7 8 6 7 8 9]copy(c3, c4)fmt.Println("c3", c3) //c3 [7]fmt.Println("c4", c4) //c4 [7 8 6 7 8 9]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.