Go中的Array和Slice
Go中的Array和Slice
翻譯來於:ofollow,noindex">https://blog.golang.org/slices
操作
extend
func Extend(slice []int, element int) []int { n := len(slice) slice = slice[0 : n+1] slice[n] = element return slice }
在下面的使用會出現錯誤:
func main() { var iBuffer [10]int slice := iBuffer[0:0] for i := 0; i < 20; i++ { slice = Extend(slice, i) fmt.Println(slice) } } 底層的buffer最大長度為10,所有在extend到10的時候會出現out of range
擴充套件版本的extend
func Extend(slice []int, element int) []int { n := len(slice) if n == cap(slice) { // Slice is full; must grow. // We double its size and add 1, so if the size is zero we still grow. newSlice := make([]int, len(slice), 2*len(slice)+1) copy(newSlice, slice) slice = newSlice } slice = slice[0 : n+1] slice[n] = element return slice }
首先要保證len和cap的帶下關係。當len不等於cap的時候extendsslice
的大小。
copy
copy(newSlice, slice) copy(slice[index+1:], slice[index:])
一定要保證容量的問題
array to slice
var array = [n]int slice = array[:] slice = array[begin:end]
slice to array
在呼叫append方法的時候需要傳入的是個數不定的element func Append(slice []int, elements ...int) []int{ } slice1 := []int{0, 1, 2, 3, 4} slice2 := []int{55, 66, 77} slice1 = Append(slice1, slice2...) // The '...' is essential!
nil slice 和 empty slice
參考:https://blog.golang.org/go-slices-usage-and-internals
var slice []int 這裡的slice==nil 但是 slice = make([]int,0,0) slice不等於nil
cap len 操作
nil slice的cap和len的大小都為0 並且可以使用append操作