天天看點

GO之數組切片

切片

-本身并不是數組,它指向底層的數組

-作為變長數組的替代方案,可以關聯底層數組的局部或全部

-為引用類型

-使用len()擷取元素的個數,cap()擷取容量

-一般使用make()建立

-如果多個slice指向相同底層數組,其中一個的值改變會影響全部

-make([]T,len,cap)

-其中cap 可以省略,則和len的值相同

package main

import "fmt"

func main(){

var s1[10]int 

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

fmt.Println(s1)

s2 :=s1[:9]

s3 :=s1[4:8] //包含開始不包含結束

fmt.Println(s2)

}

使用make聲明數組

s1 :=make([]int,3,9)

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

--從一個slice取出一個新的slice

Reslice:從一個slice取出一個新的slice

Reslice時索引被slice的切片為準

索引不可以超過被slice的切片的容量cap()值

索引越界不會導緻底層數組的重新配置設定而是引發錯誤

Append

可以在slice尾部追加元素

可以将一個slice追加在另一個slice尾部

如果最終未超過追加到slice的容量則傳回原始slice//記憶體位址沒有改變

如果超過追加到的slice的容量則将重新配置設定數組并拷貝原始資料//重新配置設定記憶體位址

    s1 :=make([]int,3,6)

fmt.Println("%v  %p\n",s1,s1)

s1=append(s1,1,2)

fmt.Println("%v %p\n",s1,s1)

Copy

    s1 :=[]int{1,2,3,4,5,6,7}

s2 :=[]int{7,8,9}

copy(s1,s2) //s2的内容拷貝到s1中去,短的數組拷貝到長的數組,改變長的幾個

copy(s2,s1) //長的數組拷貝到短的數組中去,隻會比對短的個數長度

copy(s2[2:2],s1[1:3])//拷貝到s2的指定并覆寫原有的資料

    s1 :=[]int{1,2,3,4,5,6,7,1,1,1}

s2 :=[]int{7,8,9,11,22,33,44,55,66,77,88}

copy(s2[10:],s1[1:3])//拷貝到s2的指定并覆寫原有的資料.若複制的值超過被複制的數組,隻會留下部分複制的資料,s1的值隻會在s2留下一個

fmt.Println(s1[1:3])

##周遊、修改切片

###注意:使用 “_” 則表示忽略,因為go語言中,未使用的值會導緻編譯錯誤,隻有一個元素時,該元素代表索引,在元素周遊中,是不能直接修改,主要是因為值傳遞,為該切片元素的副本,修改它不會影響原本值,隻有修改的是該切片的元素引用的值,才可以修改

本文轉自 DBAspace 51CTO部落格,原文連結:http://blog.51cto.com/dbaspace/1961885