【Go】slice, 切片

slice 熟悉Javascript的同学应该会以为是Array的slice方法,切片方法

go的slice,我们把它当作迭代器来理解,而且这个迭代器是包括两个下标指示器

定义

1
2
3
4
5
6
7
8
// 标识了 s 是一个slice,这个slice会指向 []int 型数组
var s []int

//
arr := [6]int{1, 2, 3, 4, 5, 6}

// s 这个slice切片,被初始化为原数组 arr 下标 [1, 3) 的区域
var s []int = arr[1:3]

我们来看一个完整的例子

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {
arr := [5]int{1, 2, 3, 4, 5}

var s []int = arr[1:3]

fmt.Println(s)
}

保存为 helloworld.go ,执行结果

1
2
[me@VM_0_14_centos go]# go run helloworld.go 
[2 3]

底层

slice切片仅仅是描述了对数组区间[x, y)元素的引用, slice切片本身并不存储任何数据

对切换元素修改,会直接影响到原数组中的元素

slice切片的默认行为

slice切片具有一定的默认行为

切片下界的默认值为 0
上界则是切换长度


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var a [10]int

// 以下切片等价 a[0:10]
a[0: 10]
a[:10]
a[0:0]
a[:]


#### 切片的长度和容量

切片拥有长度和容量的两个概念

切换长度是指它所包含的元素个数,可以通过表达式 len(s) 获取
切换容量是切换第一个元素到其所指向底层数组的最后一个元素的个数,可以通过 cap(s) 获取

```go
s := []int{1, 3, 4, 5, 6, 8}

s = s[2:5]

// s长度是3
len(s)

// s容量是4
cap(4)

slice切片的零值

slice切换未初始化的情况下,是 nil

nil 的长度和容量都是 0, 而且没有底层引用数组

坚持原创技术分享,谢谢鼓励我继续创作!