核心前提
切片的本质是「动态数组」,定义核心是 []元素类型,区别于数组的 [固定长度]元素类型。
一、空切片(最常用,后续需 append 元素)
场景:初始化空切片,后续通过 append 添加元素(比如存储价格、列表数据)
| 写法(精简度排序) | 代码示例 | 说明 |
|---|---|---|
| 极简(短声明) | s := []int{} |
直接字面量创建空切片,len=0、cap=0 |
| 规范(make) | s := make([]int, 0) |
显式用 make 创建,len=0、cap=0 |
| 性能优化(指定 cap) | s := make([]int, 0, 10) |
初始 len=0、cap=10,减少后续扩容开销 |
示例(自定义类型):
// 空切片存储 SpotPrice 结构体(你的业务场景)
prices := []SpotPrice{} // 极简
prices := make([]SpotPrice, 0) // 规范
prices := make([]SpotPrice, 0, 10) // 带初始容量(推荐已知数量范围时用)
二、带初始值的切片
场景:创建时直接填入初始元素(无需后续 append)
| 写法 | 代码示例 | 说明 |
|---|---|---|
| 基础写法 | s := []int{1, 2, 3} |
len=3、cap=3,直接初始化元素 |
| 指定长度截断 | s := []int{1, 2, 3}[:2] |
取前 2 个元素,len=2、cap=3 |
示例(业务场景):
// 初始化包含2个可用区价格的切片
prices := []SpotPrice{{AvailabilityZone: "us-west-2a", SpotPrice: 0.8672},{AvailabilityZone: "us-west-2b", SpotPrice: 0.7036},
}
三、从数组 / 已有切片派生(切片表达式)
场景:基于现有数组 / 切片,截取部分元素生成新切片
| 写法 | 代码示例 | 说明 |
|---|---|---|
| 基础截取 | s := arr[1:3] |
取 arr 索引 1~2(左闭右开)的元素 |
| 省略起始 | s := arr[:3] |
从索引 0 到 2 |
| 省略结束 | s := arr[1:] |
从索引 1 到最后 |
| 全量截取 | s := arr[:] |
复制整个数组 / 切片(生成新切片) |
示例:
arr := [5]int{1,2,3,4,5} // 数组
s1 := arr[1:3] // [2,3],len=2、cap=4(继承原数组容量)
s2 := []int{1,2,3,4}[1:] // [2,3,4],从已有切片派生
四、类型别名 / 自定义类型切片
场景:基于自定义类型(如你的 SpotPrice)定义切片
// 1. 先定义自定义类型
type SpotPrice struct {AvailabilityZone stringSpotPrice float64
}// 2. 精简定义切片(3种写法)
prices := []SpotPrice{} // 空切片
prices := make([]SpotPrice, 0, 10) // 带初始容量
prices := []SpotPrice{{"us-west-2a", 0.8672}} // 带初始值
五、核心精简原则(避坑)
- 优先短声明:能用
:=就不用var(如s := []int{}替代var s []int = []int{}); - 空切片选字面量:
[]T{}比make([]T, 0)更精简,仅当需要指定初始容量时用make([]T, 0, cap); - 避免冗余长度:切片无需指定固定长度(如
[]int{}而非[0]int{},后者是数组); - 派生切片省内存:从数组 / 已有切片截取(
arr[1:3])比重新创建更高效。
总结(常用写法速查表)
| 需求 | 最简写法 |
|---|---|
| 空切片(后续 append) | s := []T{} |
| 空切片(指定容量) | s := make([]T, 0, cap) |
| 带初始值切片 | s := []T{v1, v2, v3} |
| 从数组 / 切片派生 | s := src[start:end] |
| 自定义类型空切片 | s := []自定义类型{} |
所有写法均去掉冗余关键字 / 符号,聚焦核心逻辑,可直接复制到代码中使用。