Go 语言切片(Slice)
Go 语言切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
定义切片
你可以声明一个未指定大小的数组来定义切片:
var identifier []type
切片不需要说明长度。
或使用make()函数来创建切片:
var slice1 = make([] type, len) 或者写成如下slice1 := make([] type, len)
也可以指定容量,其中capacity为可选参数
slice1 := make([] type, len, capacity)
切片的实例
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 //初始化数组blance,元素为1,2,3,4,5,6 9 var blance = [] int{1, 2, 3, 4, 5, 6} 10 //初始化数组slice1因为没有给值,所以默认填充了3个0 11 var slice1 = make([] int,3 ,5) 12 13 //输出数组的初始化的值 14 fmt.Println("初始化数组blance的值:", blance) 15 fmt.Println("初始化数组slice1的值:", slice1) 16 17 //切片的操作,可以通过索引取值 18 fmt.Println("blance数组中第二个索引的值为:",blance[2]) 19 20 //修改blance数组中最后一个值 21 blance[5] = 10000 22 fmt.Println("修改blance数组最后一个值以后的结果:",blance) 23 24 //使用切片给s数组赋值,从blance数组中的第0个索引取到第三个索引,但不包含第三个索引的值 25 s := blance[:3] 26 fmt.Println("blance数组切片获取的数组s的值:", s) 27 28 }
以上代码执行的结果:
初始化数组blance的值: [1 2 3 4 5 6] 初始化数组slice1的值: [0 0 0] blance数组中第二个索引的值为: 3 修改blance数组最后一个值以后的结果: [1 2 3 4 5 10000] blance数组切片获取的数组s的值: [1 2 3]
len() 和 cap() 函数
切片是可索引的,并且可以由 len() 方法获取长度。
切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 //len可以获取数组的总长度,cap可以获取切片最大的长度 8 func printSlice(x [] int,name string ){ 9 fmt.Printf("len=%d cap=%d %v=%v \n", len(x), cap(x) ,name , x ) 10 fmt.Println("--------------------------------") 11 } 12 13 func main() { 14 //初始化数组blance,元素为1,2,3,4,5,6 15 var blance = [] int{1, 2, 3, 4, 5, 6} 16 17 //调用打印切片的函数 18 printSlice(blance,"blance") 19 20 //初始化一次数组最大长度为8个,初始化填充3个0的数组s 21 s := make([] int,3 ,8) 22 fmt.Println("初始化数组s的值为:", s) 23 24 //调用打印切片的函数 25 printSlice(s,"s") 26 27 }
以上代码执行的结果:
len=6 cap=6 blance=[1 2 3 4 5 6] -------------------------------- 初始化数组s的值为: [0 0 0] len=3 cap=8 s=[0 0 0] --------------------------------
append() 和 copy() 函数
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。
下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 //len可以获取数组的总长度,cap可以获取切片最大的长度 8 func printSlice(x [] int,name string ){ 9 fmt.Printf("len=%d cap=%d %v=%v \n", len(x), cap(x) ,name , x ) 10 fmt.Println("--------------------------------") 11 } 12 13 func main() { 14 var numbers [] int 15 printSlice(numbers,"numbers") 16 17 //追加空切片 18 numbers = append(numbers,) 19 printSlice(numbers,"numbers") 20 21 //追加一个元素 22 numbers = append(numbers,1) 23 printSlice(numbers,"numbers") 24 25 //同时追加多个元素 26 numbers = append(numbers,9, 9, 81) 27 printSlice(numbers,"numbers") 28 29 //创建n1数组是numbers的两倍的容量 30 n1 := make([] int, len(numbers), len(numbers)*2) 31 printSlice(n1,"n1") 32 33 //拷贝numbers数组中的内容到n1中,会在对应的索引的地方覆盖已有的内容 34 copy(n1, numbers) 35 printSlice(n1,"n1") 36 37 //声明局部数据test,初始化元素两个2,数组允许最大3个元素 38 test := make([] int,2,3) 39 printSlice(test,"test") 40 //往test数组中添加数据,因为超过了最大长度的3个,go会维持内存,会另外申请一个乘以最大容量*2的容量赋值给test数组 41 test = append(test,1, 2 ,3) 42 printSlice(test,"test") 43 }
以上代码执行的结果:
len=0 cap=0 numbers=[] -------------------------------- len=0 cap=0 numbers=[] -------------------------------- len=1 cap=1 numbers=[1] -------------------------------- len=4 cap=4 numbers=[1 9 9 81] -------------------------------- len=4 cap=8 n1=[0 0 0 0] -------------------------------- len=4 cap=8 n1=[1 9 9 81] -------------------------------- len=2 cap=3 test=[0 0] -------------------------------- len=5 cap=6 test=[0 0 1 2 3] --------------------------------
时间: 2024-11-10 14:46:00