Go 语言的切片(示例代码)
Slice
是一个通过指向数组底层,来进行变长数组的实现。
- 定义切片的格式:
var
;[]
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([]
格式来创建, len, cap) slice
。其中,len
表示slice
的长度,cap
表示slice
的容量;cap
的值默认情况下与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
的值
// 通过 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
Reslice
表示将一个 Slice
再次 Slice
。
-
Reslice
与slice
都是指向同一底层数组; -
Reslice
的索引以slice
的索引为准,其最大容量(cap)为slice
的容量; - 索引越界不会导致底层数组的重新分配,而是引发错误。
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
}
Slice 的操作
- append
append()
用于在 slice
后最追加新的元素,这些元素保存到底层数组,并不会影响原 slice
z,它返回变更后新的 slice
对象。
如果追加的元素超出之前的 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
copy(目标 slice, 被拷贝的 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]
}