Open SilenceHVK opened 6 years ago
Slice 是一个通过指向数组底层,来进行变长数组的实现。
Slice
var <sliceName> []<type>
package basic import "fmt" func DeclaratSlice(){ // 定义一个空 slice var slice1 []int fmt.Println(slice1) // [] // 定义一个 slice 并赋初始值 slice2 := []int{ 1, 3, 4 } fmt.Println(slice2) // [1 3 4] }
make([]<type>, len, cap)
slice
len
cap
package basic import "fmt" // 通过 make 声明 切片 func DeclaratSliceByMake() { var slice1 = make([]int, 6) fmt.Println(slice1) // [0 0 0 0 0 0] }
可以通过内置函数 len() 和 cap() 可以获取 slice 的 len 与 cap 的值
len()
cap()
// 通过 make 声明 切片 func DeclaratSliceByMake() { var slice1 = make([]int, 6) fmt.Println(slice1) // [0 0 0 0 0 0] fmt.Println("len(slice1) = ", len(slice1)) // len(slice1) = 6 fmt.Println("cap(slice1) = ", cap(slice1)) // cap(slice1) = 6 }
Reslice 表示将一个 Slice 再次 Slice。
Reslice
package basic import "fmt" // Reslice func Reslice() { array := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} slice1 := array[2:5] slice2 := slice1[0:6] fmt.Println("array=", array, "len=", len(array), "cap=", cap(array)) // array= [0 1 2 3 4 5 6 7 8 9] len= 10 cap= 10 fmt.Println("slice1=", slice1, "len=", len(slice1), "cap=", cap(slice1)) // slice1= [2 3 4] len= 3 cap= 8 fmt.Println("slice2=", slice2, "len=", len(slice2), "cap=", cap(slice2)) // slice2= [2 3 4 5 6 7] len= 6 cap= 8 }
append() 用于在 slice 后最追加新的元素,这些元素保存到底层数组,并不会影响原 slicez,它返回变更后新的 slice 对象。
append()
如果追加的元素超出之前的 slice 容量,则重新分配数组并拷贝原数据,并不影响底层数组。
package basic import "fmt" func SliceByAppend() { array := [...]int{0, 1, 2, 3} slice := array[:2] fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc42001c160 [0 1], cap = 4 slice = append(slice, 10) fmt.Printf("%p %v\n", &array, array) // 0xc42001c160 [0 1 10 3] cap = 4 fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc42001c160 [0 1 10], cap = 4 slice = append(slice, 15, 20) fmt.Printf("%p %v cap = %d \n", &array, array, cap(array)) // 0xc42001c160 [0 1 10 3] cap = 4 fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc420012240 [0 1 10 15 20], cap = 8 }
copy(目标 slice, 被拷贝的 slice),用于拷贝 slice,返回值为拷贝的个数。
copy(目标 slice, 被拷贝的 slice)
package basic import "fmt" func SliceByCopy() { sliceA := []int{1, 2, 3, 4, 5} sliceB := []int{5, 4} copyCount := copy(sliceA, sliceB) fmt.Println(copyCount) // 2 fmt.Println(sliceA) // [5 4 3 4 5] fmt.Println(sliceB) // [5 4] }
Go 语言的切片
Slice
是一个通过指向数组底层,来进行变长数组的实现。var <sliceName> []<type>
;make([]<type>, len, cap)
格式来创建slice
。其中,len
表示slice
的长度,cap
表示slice
的容量;cap
的值默认情况下与len
相等,cap
可以省略;Reslice
Reslice
表示将一个Slice
再次Slice
。Reslice
与slice
都是指向同一底层数组;Reslice
的索引以slice
的索引为准,其最大容量(cap)为slice
的容量;Slice 的操作
append()
用于在slice
后最追加新的元素,这些元素保存到底层数组,并不会影响原slice
z,它返回变更后新的slice
对象。如果追加的元素超出之前的
slice
容量,则重新分配数组并拷贝原数据,并不影响底层数组。copy(目标 slice, 被拷贝的 slice)
,用于拷贝slice
,返回值为拷贝的个数。