Go语言的切片

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

Go语言的切片的相关文章

【Go语言】【7】GO语言的切片

如果说GO语言的数组为静态长度的数组,那么切片(slice)则为动态长度的数组 一.基于数组创建切片 1.存在一个整型数组intArr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},那么下面的slice就是数组切片 var slice []int = intArr[3:7] 从图中可以看出切片从数组的第4个元素开始读取数据,直至第8个元素(但不包含第8个).切记程序员的计数都是从0开始的哟 2.若只读intArr数组的前4个元素,该如何办呢?聪明的你一定能想

Go语言数组,切片

数组声明 Go 语言数组声明需要指定元素类型及元素个数,语法格式如下: var variable_name [SIZE] variable_type 以上为一维数组的定义方式.数组长度必须是整数且大于 0.例如以下定义了数组 balance 长度为 10 类型为 float32: var balance [10] float32 初始化数组 以下演示了数组初始化: var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} 初始化数组中 {} 中的

Go语言之切片

切片也是一种数据结构,它和数组非常相似,因为他是围绕动态数组的概念设计的,可以按需自动改变大小,使用这种结构,可以更方便地管理和使用数据集合. 内部实现 切片是基于数组实现的,它的底层是数组,它自己本身非常小,可以理解为对底层数组的抽象.因为机遇数组实现,所以它的底层的内存是连续非配的,效率非常高.它还有可以通过索引获得数据.可以迭代以及垃圾回收优化的好处. 切片对象非常小,是因为它是只有 3 个字段的数据结构:一个是指向底层数组的指针,一个是切片的长度,一个是切片的容量.这 3 个字段,就是G

Go语言之切片Slice练习

切片Slice理论知识 其本身并不是数组,它指向底层的数组 作为编程数组的替代方案,可以关联底层数组的局部或者全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 一般使用make()创建 如果多个slice指向相同底层数组,其中一个的值改变会影响全部 make([]T, len, cap) 其中,cap可以省略,则和len的值相同 len表示存数的元素个数,cap表示容量 slice与底层数组的关系 Reslice Reslice时索引以被slic

go语言笔记——切片函数常见操作,增删改查和搜索、排序

7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 sort.Ints(arri),其中变量 arri 就是需要被升序排序的数组或切片.为了检查某个数组是否已经被排序,可以通过函数 IntsAreSorted(a []int) bool 来检查,如果返回 true 则表示已经被排序. 类似的,可以使用函数 func Float64s(a []floa

Go语言-切片和map

实例 package main import ( "fmt" ) func main() { arr := make([]int, 0) //arr := make([]int) is wrong //arr := make([]int, 100) is right arr = append(arr, 1) arr = append(arr, 2) arr = append(arr, 3) arr = append(arr, 4) mymap := make(map[int]strin

GO语言总结(3)——数组和切片

上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: func test5() { var iarray1 [5]int32

go语言数组与切片比较

一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() {    var iarray1 [5]int32    var iarray2 [5]int32 = [5]int32{1, 2, 3,

使用go语言绕过page cache读写文件

有时候,我们希望我们的数据不通过page cache的缓冲直接落盘.go语言里,用参数DIRECT打开文件可以实现这一点要求. 但这样做有一个硬性的要求,就是在读写的时候,对应的数据在内存中的地址一定要满足512对齐,即首地址的2进制形式中后面至少要有9个0结尾,且数据长度为512字节的整数倍,否则读写会失败. 我们用go语言中的切片slice来验证这件事. 首先我们建立一个go语言的切片并随便赋一些值: buf := make([]byte, 8192) for i := 0; i < 20;