首先理解一下基本概念:数组是一个具有特定类型且大小固定的有序集合,定义方式如下:
go
var array [n]type
这里 `n` 是数组容量(即元素个数),`type` 表示存储在其中的所有元素的类型。
然而,在实际编程过程中,经常需要动态地改变序列的长度或添加新的项目,这时就需要用到更高级、更为灵活的数据结构——切片。虽然切片本身不持有任何数据,但它包含指向底层数组起始位置的指针以及相关的长度与容量信息。
要从数组创建切片有以下几种方法:
1. 使用内置函数 make 创建:
go
package main
import "fmt"
func main() {
// 定义并初始化一个整型数组
arr := [5]int{0, 1, 2, 3, 4}
// 基于整个数组创建一个新的切片,并默认拥有相同的长度及容量
slice := arr[:]
fmt.Println("Slice:", slice)
}
2. 直接索引构造法:
利用 arrays 的特性可以选取一部分元素形成新切片。
go
package main
import (
"fmt"
)
func main(){
numbers := [6]int{1, 2, 3, 4, 5, 6}
// 创建一个始于第1个元素终止至第4个元素的新切片
subslice := numbers[1:4]
fmt.Println("Sub-slice from the original array:", subslice)
}
上述代码展示了两种主要的方式利用数组产生切片,第一段代码是获取了原数组arr所有元素构成与其等长的切片;第二段则演示的是选择部分元素作为新建切片的内容。注意这里的切片表达式 `[low : high]` 包含下限 low ,但是并不包括上限 high,也就是说取值范围为 `[low, high)` 。
总之,无论我们采用哪种途径,Go中的切片都为我们提供了操作类似数组这样连续内存区域的一种便捷手段,它的灵活性体现在能够方便调整其内部所引用内容的数量上,而不必像普通数组那样必须预先知道确切的尺寸。这种机制使得我们在实现诸如扩容、截断等功能时更加得心应手。