数组是固定长度的、具有相同数据类型元素的有序集合。数组在Go语言中是值类型,这意味着当数组被赋值给一个新变量或传递给函数时,会创建整个数组的副本。
// 数组声明方式
var arr1 [3]int // 声明但不初始化
arr2 := [3]int{1, 2, 3} // 声明并初始化
arr3 := [...]int{1, 2, 3, 4, 5} // 编译器计算长度
切片是对数组的抽象,提供动态大小的灵活视图。切片是引用类型,包含三个组件:指向底层数组的指针、长度和容量。
// 切片创建方式
var slice1 []int // 声明切片
slice2 := make([]int, 3, 5) // 使用make,长度3,容量5
slice3 := []int{1, 2, 3} // 字面量声明
slice4 := arr2[1:3] // 从数组创建
切片的扩容机制:当切片容量不足时,Go会自动扩容。容量小于1024时通常翻倍,超过1024时增加25%左右。
数组适用场景:
切片适用场景:
电商购物车实现:
package main
import "fmt"
type CartItem struct {
Name string
Price float64
Quantity int
}
func main() {
// 使用切片管理购物车商品(动态增减)
var cart []CartItem
// 添加商品
cart = append(cart, CartItem{"笔记本电脑", 5999.99, 1})
cart = append(cart, CartItem{"无线鼠标", 89.90, 2})
cart = append(cart, CartItem{"电脑包", 120.50, 1})
// 计算总价
total := 0.0
for _, item := range cart {
total += item.Price * float64(item.Quantity)
}
fmt.Printf("购物车总价: ¥%.2f\n", total)
fmt.Printf("商品数量: %d\n", len(cart))
// 模拟商品下架(移除第一个商品)
if len(cart) > 0 {
cart = cart[1:]
}
fmt.Printf("移除后商品数量: %d\n", len(cart))
}
切片高级操作:
package main
import "fmt"
func main() {
// 1. 预分配容量优化性能
ids := make([]int, 0, 100) // 长度0,容量100
for i := 0; i < 100; i++ {
ids = append(ids, i)
}
// 2. 切片复制避免内存泄漏
importantData := make([]byte, 0, 10*1024*1024) // 10MB
// ...填充数据...
returnData := make([]byte, len(importantData))
copy(returnData, importantData) // 复制需要的数据
// 3. 批量处理
data := make([]int, 1000)
batchSize := 100
for i := 0; i < len(data); i += batchSize {
end := i + batchSize
if end > len(data) {
end = len(data)
}
batch := data[i:end]
processBatch(batch)
}
// 4. 多维切片
matrix := make([][]int, 3)
for i := range matrix {
matrix[i] = make([]int, 3)
}
}
func processBatch(batch []int) {
fmt.Printf("处理批次,大小: %d\n", len(batch))
}