1.5 数组与切片
数组
go
package main
import "fmt"
func main() {
// 数组声明
var arr1 [5]int // [0 0 0 0 0]
arr2 := [5]int{1, 2, 3, 4, 5}
arr3 := [...]int{1, 2, 3} // 编译器推断长度
// 数组访问
arr2[0] = 100
fmt.Println(arr2[0])
// 数组遍历
for i, v := range arr3 {
fmt.Println(i, v)
}
// 数组是值类型
a := [3]int{1, 2, 3}
b := a // 复制整个数组
b[0] = 100
fmt.Println(a) // [1 2 3] - 不变
// 多维数组
matrix := [2][3]int{{1, 2, 3}, {4, 5, 6}}
fmt.Println(matrix[0][1]) // 2
}切片
go
package main
import "fmt"
func main() {
// 从数组创建
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4] // [2 3 4]
// 直接创建
s := []int{1, 2, 3}
// make 创建
s1 := make([]int, 5) // 长度 5
s2 := make([]int, 3, 5) // 长度 3,容量 5
// 切片属性
fmt.Println(len(s)) // 长度
fmt.Println(cap(s)) // 容量
// 切片是引用类型
sub := s[1:3]
sub[0] = 200
fmt.Println(s) // [1 200 3]
}append 和 copy
go
package main
import "fmt"
func main() {
// append
s := []int{1, 2, 3}
s = append(s, 4) // [1 2 3 4]
s = append(s, 5, 6, 7) // [1 2 3 4 5 6 7]
s = append(s, []int{8, 9}...) // 追加另一个切片
// copy
src := []int{1, 2, 3, 4, 5}
dst := make([]int, 3)
copy(dst, src) // dst = [1 2 3]
// 原地删除
arr := []int{1, 2, 3, 4, 5}
i := 2
arr = append(arr[:i], arr[i+1:]...) // [1 2 4 5]
}切片扩容机制
go
package main
import "fmt"
func main() {
// 扩容策略:
// 1. 容量 < 256: 新容量 = 旧容量 * 2
// 2. 容量 >= 256: 新容量 = 旧容量 * 1.25
var s []int
for i := 0; i < 20; i++ {
s = append(s, i)
fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
}
}多维切片
go
package main
import "fmt"
func main() {
// 二维切片
matrix := [][]int{
{1, 2, 3},
{4, 5, 6},
}
// make 创建
rows, cols := 3, 4
m := make([][]int, rows)
for i := range m {
m[i] = make([]int, cols)
}
// 遍历
for _, row := range matrix {
for _, v := range row {
fmt.Print(v, " ")
}
fmt.Println()
}
}