Go 语言切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
定义方式:
~~~
1) make ( []Type ,length, capacity )
2) make ( []Type, length)
3) []Type{}
4) []Type{value1 , value2 , ... , valueN }
~~~
从3)和4)可见,创建切片跟创建数组唯一的区别在于 Type 前的"[]"中是否有数字或....,没有表示切片,否则表示数组。
## 一、示例
~~~
package main
import (
"fmt"
)
func main() {
slice1 := make([]int32, 5, 8)
slice2 := make([]int32, 9)
slice3 := []int32{}
slice4 := []int32{1, 2, 3, 4, 5}
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(slice3)
fmt.Println(slice4)
}
~~~
结果:
~~~
[0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[]
[1 2 3 4 5]
~~~
## 二、append()追加元素
~~~
package main
import (
"fmt"
)
func main() {
slice := []int32{}
slice = append(slice, 1, 2, 3)
fmt.Println(slice, "长度:", len(slice), "容量:", cap(slice))
}
~~~
结果:
~~~
[1 2 3] 长度: 3 容量: 4
~~~
## 三、切片(索引从0开始,包左不包右)
~~~
numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
fmt.Println(numbers[1:4]) // >=1 && <4
fmt.Println(numbers[:3]) // <3
fmt.Println(numbers[4:]) // >=4
~~~
结果:
~~~
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
~~~
## 四、copy()复制
~~~
numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
numbers2 := []int{}
copy(numbers2, numbers) // 把numbers复制到numbers2
fmt.Println(numbers2)
~~~
结果:
~~~
numbers2 == [0 1 2 3 4 5 6 7 8]
~~~