建立新的 t slice,將 s 的內容複製到 t,再將 t 分配給 s,就能使 s 對應到加倍 cap 的 t
12345
t:=make([]byte,len(s),(cap(s)+1)*2)// +1 in case cap(s) == 0fori:=ranges{t[i]=s[i]}s=t
loop 複製的部分,可以透過內建的 copy 簡單完成
1
funccopy(dst,src[]T)int
也可以在不同長度的 slice 進行 copy
1234
// s 複製到 tt:=make([]byte,len(s),(cap(s)+1)*2)copy(t,s)s=t
更常見的操作,是將 data append 在後面,必要時會產生新的 slice
123456789101112131415161718
funcAppendByte(slice[]byte,data...byte)[]byte{// 原本 slice 的長度m:=len(slice)// 原本 slice 的長度 + 新的 data 的長度n:=m+len(data)// 如果加總的長度,比原本的 slice 的容量還長,就建立新的 sliceifn>cap(slice){// if necessary, reallocate// allocate double what's needed, for future growth.newSlice:=make([]byte,(n+1)*2)copy(newSlice,slice)slice=newSlice}// 將 slice 切到跟加總的長度一樣slice=slice[0:n]// 將新的 data 複製到,slice 的後面copy(slice[m:n],data)returnslice}
像是這樣
123
p:=[]byte{2,3,5}p=AppendByte(p,7,11,13)// p == []byte{2, 3, 5, 7, 11, 13}
像 AppendByte 的 function 非常有用,因為可以控制 slice 擴充方式
golang 內建就有 append
1
funcappend(s[]T,x...T)[]T
func append 可以將 x 元素,append 在 data 後面,如果需要更大的容量,會自動分配新的 slice
1234
a:=make([]int,1)// a == []int{0}a=append(a,1,2,3)// a == []int{0, 1, 2, 3}
要 append slice to slice 可以用 ...,將參數作為列表
1234
a:=[]string{"John","Paul"}b:=[]string{"George","Ringo","Pete"}a=append(a,b...)// equivalent to "append(a, b[0], b[1], b[2])"// a == []string{"John", "Paul", "George", "Ringo", "Pete"}
12345678910111213141516171819202122232425262728
packagemainimport("fmt")// Filter returns a new slice holding only// the elements of s that satisfy fn()funcFilter(s[]int,fnfunc(int)bool)[]int{varp[]int// == nilfor_,v:=ranges{iffn(v){p=append(p,v)}}returnp}funcmain(){p:=[]int{2,3,5,11,13,15}f:=func(xint)bool{returnx>10}p=Filter(p,f)fmt.Println(p)}// [11 13 15]