Go 语言切片(Slice),学习时候对比python 的切片
Go 数组的长度固定,切片是内置类型,长度是不固定的,可以追加(append)元素,在追加后容量(cap)增大。
定义切片
- 声明未指定大小的数组来定义切片:
var identifier []type //切片不需要说明长度区别于数组。 - 使用make()函数来创建切片:
var slice1 []type = make([]type, len)
也可以简写为: slice1 := make([]type, len) - 指定容量,其中capacity为可选参数。
make([]T, length, capacity )// len 是数组的长度并且是切片的初始长度。
切片初始化
- 直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
s :=[] int {1,2,3 } - 初始化切片s,是数组arr的引用 , s := arr[:]
- 创建为一个新的切片,根据下标截断 ,
s := arr[startIndex:endIndex]
s := arr[startIndex:] //默认 startIndex 时将表示一直到arr的最后一个元素
s := arr[:endIndex] //默认endIndex 时将表示从arr的第一个元素开始 - 通过切片s初始化切片s1,s1 := s[startIndex:endIndex]
- 通过内置函数make()初始化切片s,s :=make([]int,len,cap)
len() 和 cap() 函数
切片是可索引的,由 len() 方法获取长度。提供容量的方法 cap()
切片截取
设置下限及上限来设置截取切片
append() 和 copy() 函数
在做函数调用时,slice 按引用传递(可以修改调用者源数组内容),array 按值传递(不修改调用者的原数组内容)
package main
import "fmt"
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
func main() {
var slice []int
printSlice(slice)
/* 允许追加空切片 */
slice = append(slice, 12)
slice = append(slice, 0)
printSlice(slice)
/* 向切片添加一个元素 */
slice = append(slice, 1)
printSlice(slice)
/* 同时添加多个元素 */
slice = append(slice, 2,3,4)
printSlice(slice)
/*拷贝切片需要先分配好空间*/
/* 创建切片 numbers1 是之前切片的两倍容量*/
numbers1 := make([]int, len(slice), (cap(slice))*2)
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,slice)
printSlice(numbers1)
}
C:\Go\bin\go.exe build -o C:\Users\l04966\AppData\Local\Temp\___go_build_qiepian_go.exe C:/Go/workspace/qiepian/qiepian.go #gosetup
C:\Users\l04966\AppData\Local\Temp\___go_build_qiepian_go.exe #gosetup
len=0 cap=0 slice=[]
len=2 cap=2 slice=[12 0]
len=3 cap=4 slice=[12 0 1]
len=6 cap=8 slice=[12 0 1 2 3 4]
len=6 cap=16 slice=[12 0 1 2 3 4]
Process finished with exit code 0
GO切片与python 切片的不同:
go有切片类型,python有列表和元组,都有切片操作。
切片方法使用是不同的。
- go的切片,其成员是相同类型的,python的列表和元组则不限制类型。
- 两种语言都有[a:b]这种切片操作,意义也类似,go的a、b两个index不能是负数,python可以是负数,此时就相当于从末尾往前数。
- 两种语言都有[a🅱️c]这种切片操作,意义却是完全不同的。go的c,表示的是容量;而python的c表示的是步长。
- python的切片产生的是新的切片对象,对新对象的成员的操作不影响旧对象,go的切片产生的是旧对象一部分的引用,对其成员的操作会影响旧对象。