Skip to main content

数组与切片

go语言提供了数组的支持,我们通过内置函数可以方便的操作数组。

  • 数组(array) 是一个固定长度的序列,它可以包含0个或多个元素
  • 切片(slice) 则可以增加,缩小。切片更灵活

1. 数组定义及取值

var arr [3]int  //声明一个长度为3的整型数组
var b [3]int = [3]int{6,7,8} // 声明并赋值
c := [3]int{3,4,5} // 声明并赋值

这样声明后,就可以通过下标访问数组了,数组下标从0开始。

fmt.Println(arr[0])

声明切片

var arr []int  //声明一个切片

我们不指定长度,就可以了

2. 数组读取

2.1 数组遍历

我们可以使用for循环来遍历数组

for i, v := range arr {
fmt.Printf("%v %v\n", i, v)
}

这时会输出

0 0
1 0
2 0

由此我们可以看到上面的 i 表示下标,v 表示数组里的元素。当然你可以定义其它的变量名,让业务上更好理解。

2.2 获取数组长度

在go语言中,我们通过 len 函数获取数组长度

len(arr)

3. 数组写入与变更

3.1 追加/插入一个元素

我们使用 append 函数,来向一个切片 slice ,后追加一个元素

s := []int{10}
s = append(s, 11)
for i, v := range s {
fmt.Printf("%v %v\n", i, v)
}

需要特别留意 s = append(s, 11) 这个写法,即我们需要把 append的返回值,再赋值给 s, 如果你只写了 append(s, 11) 则s里的元素还是不会增加。并且会报错: (value of type []int) is not used

注意 apend函数并不能用于数组,以下代码会报错

var arr [3]int //声明一个长度为3的整型数组
arr = append(arr, 5)

first argument to append must be a slice; have arr (variable of type [3]int)

那么如果想在切片前面加入一个元素怎么办呢?我们需要取巧的做法。看代码:

s := []int{10}
s = append([]int{11}, s...)

通过上面的代码,我们把这个元素转成切片,然后通过 ... 把原来的切片展开。

3.2 删除一个元素

a := []int{1, 2, 3}
a = a[1:] // 删除开头1个元素
a = a[N:] // 删除开头 N 个元素

a = a[:len(a)-1] // 删除最后一个元素
a = a[:len(a)-N] // 删除最后 N 个元素

i := 2
a = append(a[:i-1], a[i:]...) // 删除第 i 个元素

3.3 取数组的一部分

跟删除操作类似,直接下标操作就可以了。关键是要注意别让数组越界

a := []int{1, 2, 3}
a = a[:2] // 取前两个元素

3.4 数组合并

可以通过 append来让数组合并

a := []int{1, 2, 3}
b := []int{4, 5, 6}
a = append(a, b...)

3.5 数组逆转

a := []int{1, 2, 3, 4, 5}
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i]
}