golang基礎---Slice切片

來源:互聯網
上載者:User

切片Slice在go語言中是單獨的類型(指向底層的數組),不同於python(對可迭代對象操作的工具),注意區分數組和slice的區別

  • 定義一個空slice,格式var s []int,這種既沒有長度也沒有元素賦值的類型(相比叫array)
  • 數組的基本操作如下 ,類似與python中列表切片的操作,詳見執行個體

    package mainimport "fmt"func main() {    var s1 []int                                //這樣就是一個slice類型,既沒有長度也沒有元素賦值    a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //這是一個數組    s2 := a[5:10]                               //切片,索引5到10的元素,不包含索引為10    s3 := a[:3]                                 //切片,索引1-3的元素,不包含索引3    s4 := a[6:]                                 //切片,第6個索引到最後一個索引的元素    s5 := a[:]                                  //切片,複製一個數組    fmt.Println(s1)    fmt.Println(a)    fmt.Println(s2) //數組的切片,類似python    fmt.Println(s3)    fmt.Println(s4)    fmt.Println(s5)}/*輸出s1--->  []a--->   [0 0 0 0 0 0 0 0 0 0]s2--->  [6 7 8 9 10]s3--->  [1 2 3]s4--->  [7 8 9 10]s5--->  [1 2 3 4 5 6 7 8 9 10]*/

使用make初始化一個slice類型,包含三個參數

  • ①切片類型 []int
  • ②初始長度 len
  • ③容量 cap

    package mainimport "fmt"func main() {    s1 := make([]int, 3, 10)      //使用make初始化一個slice,包含三個參數:①切片類型②初始長度③容量    fmt.Println(len(s1), cap(s1)) //輸出長度,容量    fmt.Println(s1)}/*輸出:len(s1)--->3cap(s1)--->10s1--->  [0 0 0]  //可變數組*/

Reslice ,在原slice基礎上再次切片,slice一個數組時,不僅取出了len,同時容量也會得到相應的切片。

  • 樣本

    //Reslice,在slice基礎上再次slice.package mainimport "fmt"func main() {    a := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'k', 'm'} //定義一個數組,元素為byte類型    sa := a[3:5]                                             // slice切片,取索引三到五,不包含索引5    sb := sa[1:3]    fmt.Println(string(sa))    fmt.Println(len(sa), cap(sa))    fmt.Println(string(sb))    fmt.Println(len(sb), cap(sb))}/*輸出sting(sa)--->   delen(sa)--->     2cap(sa)--->     6string(sb)--->  eflen(sb)--->     2cap(sb)--->     5*/

Append,類似python中list類型,使用append,從數組尾部追加元素

  • 可以將一個slice追加在另一個slice尾部
  • 如果最終長度未超過追加到slice的容量,則返回原始slice
  • 如果超過追加的slice的容量則將重新分配數組並拷貝未經處理資料

    package mainimport "fmt"func main() {    s1 := make([]int, 3, 8) //初始化slice,長度位3,容量為8    fmt.Printf("%p\n", s1)  //輸出s1的記憶體位址    fmt.Println(s1)    s1 = append(s1, 1, 2, 3) //末尾追加三個元素,cap依然為8    fmt.Printf("%p\n", s1)   //原來的slice    fmt.Println(s1)    s1 = append(s1, 1, 2, 3, 4) //繼續追加元素,超過原s1容量,會重新分配新的記憶體位址    fmt.Printf("%p\n", s1)      //cap容量超過8,為9    fmt.Println(s1)}/*p*s1--->    0xc042070040s1--->      [0 0 0]p*s1s1-->   0xc042070040s1--->      [0 0 0 1 2 3]p*s1--->    0xc04205e080   //新的記憶體位址s1--->      [0 0 0 1 2 3 1 2 3 4]*/
  • 當兩個slice同時指向某一個數組時,改變某一個slice索引時,另一個slice索引值及原數組的索引也會改變

    package mainimport "fmt"func main() {    a := []int{1, 2, 3, 4, 5, 6}    s1 := a[2:5]    s2 := a[1:3]    fmt.Println(s1, s2)    s1[0] = 9    fmt.Println(s1, s2)    fmt.Println(a)}/*s1--->  [3 4 5]s2--->  [2 3]//更改s1的slice索引後,s2的索引也會改s1--->  [9 4 5]s2--->  [2 9]a--->   [1 2 9 4 5 6]*/

copy,格式 copy(s1,s2), 將s2拷貝到s1數組中,當len(s1) > len(s2)時,最終將s2中的索引
替換掉s1的索引,當len(s1)<len(s2)時,s1的索引值全部被對應s2的索引替換

  • 樣本

    package mainimport "fmt"func main() {    s1 := []int{1, 2, 3, 4, 5}    s2 := []int{6, 7, 8}    copy(s1, s2) //將s2的元素拷貝到s1,s2    fmt.Println(s1)    copy(s2, s1)    fmt.Println(s2)    copy(s1, s2[2:3]) //只拷貝某一切片的索引    fmt.Println(s1)}/*輸出s1--->  [6 7 8 4 5]s2--->  [1 2 3]s1--->  [8 2 3 4 5]*/
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.