199 lines
5.1 KiB
Go
199 lines
5.1 KiB
Go
/*
|
|
01-arrays.go - Go 语言数组详解
|
|
|
|
学习目标:
|
|
1. 理解数组的概念和特性
|
|
2. 掌握数组的声明和初始化
|
|
3. 学会数组的基本操作
|
|
4. 了解数组的内存布局
|
|
5. 掌握数组的实际应用场景
|
|
|
|
知识点:
|
|
- 数组的定义和特性
|
|
- 数组的声明和初始化方式
|
|
- 数组的访问和修改
|
|
- 数组的长度和容量
|
|
- 多维数组
|
|
- 数组的比较和拷贝
|
|
- 数组 vs 切片的区别
|
|
*/
|
|
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
func main() {
|
|
fmt.Println("=== Go 语言数组详解 ===\n")
|
|
|
|
// 演示数组的基本概念
|
|
demonstrateBasicArrays()
|
|
|
|
// 演示数组的声明和初始化
|
|
demonstrateArrayDeclaration()
|
|
|
|
// 演示数组的操作
|
|
demonstrateArrayOperations()
|
|
|
|
// 演示多维数组
|
|
demonstrateMultiDimensionalArrays()
|
|
|
|
// 演示数组的特性
|
|
demonstrateArrayProperties()
|
|
|
|
// 演示数组的实际应用
|
|
demonstratePracticalApplications()
|
|
|
|
// 演示数组 vs 切片
|
|
demonstrateArrayVsSlice()
|
|
}
|
|
|
|
// demonstrateBasicArrays 演示数组的基本概念
|
|
func demonstrateBasicArrays() {
|
|
fmt.Println("1. 数组的基本概念:")
|
|
|
|
// 数组的基本特性
|
|
fmt.Printf(" 数组的基本特性:\n")
|
|
fmt.Printf(" - 固定长度的元素序列\n")
|
|
fmt.Printf(" - 元素类型相同\n")
|
|
fmt.Printf(" - 长度是类型的一部分\n")
|
|
fmt.Printf(" - 零值是所有元素都为零值的数组\n")
|
|
fmt.Printf(" - 值类型,赋值和传参会拷贝整个数组\n")
|
|
|
|
// 基本数组示例
|
|
fmt.Printf(" 基本数组示例:\n")
|
|
|
|
var numbers [5]int // 声明长度为5的整数数组
|
|
fmt.Printf(" 声明数组: %v\n", numbers)
|
|
fmt.Printf(" 数组长度: %d\n", len(numbers))
|
|
fmt.Printf(" 数组类型: %T\n", numbers)
|
|
|
|
// 数组元素访问
|
|
numbers[0] = 10
|
|
numbers[1] = 20
|
|
numbers[2] = 30
|
|
fmt.Printf(" 修改元素后: %v\n", numbers)
|
|
fmt.Printf(" 第一个元素: %d\n", numbers[0])
|
|
fmt.Printf(" 最后一个元素: %d\n", numbers[len(numbers)-1])
|
|
|
|
fmt.Println()
|
|
}
|
|
|
|
// demonstrateArrayDeclaration 演示数组的声明和初始化
|
|
func demonstrateArrayDeclaration() {
|
|
fmt.Println("2. 数组的声明和初始化:")
|
|
|
|
// 方式1: 声明后赋值
|
|
fmt.Printf(" 方式1 - 声明后赋值:\n")
|
|
var arr1 [3]int
|
|
arr1[0] = 1
|
|
arr1[1] = 2
|
|
arr1[2] = 3
|
|
fmt.Printf(" arr1: %v\n", arr1)
|
|
|
|
// 方式2: 声明时初始化
|
|
fmt.Printf(" 方式2 - 声明时初始化:\n")
|
|
var arr2 = [3]int{10, 20, 30}
|
|
fmt.Printf(" arr2: %v\n", arr2)
|
|
|
|
// 方式3: 短变量声明
|
|
fmt.Printf(" 方式3 - 短变量声明:\n")
|
|
arr3 := [4]string{"Go", "Python", "Java", "C++"}
|
|
fmt.Printf(" arr3: %v\n", arr3)
|
|
|
|
// 方式4: 自动推断长度
|
|
fmt.Printf(" 方式4 - 自动推断长度:\n")
|
|
arr4 := [...]int{1, 2, 3, 4, 5} // ... 让编译器计算长度
|
|
fmt.Printf(" arr4: %v (长度: %d)\n", arr4, len(arr4))
|
|
|
|
// 方式5: 指定索引初始化
|
|
fmt.Printf(" 方式5 - 指定索引初始化:\n")
|
|
arr5 := [5]int{1: 10, 3: 30, 4: 40} // 指定索引1,3,4的值
|
|
fmt.Printf(" arr5: %v\n", arr5)
|
|
|
|
// 方式6: 混合初始化
|
|
fmt.Printf(" 方式6 - 混合初始化:\n")
|
|
arr6 := [...]string{0: "first", 2: "third", "fourth"} // 混合指定索引和顺序
|
|
fmt.Printf(" arr6: %v (长度: %d)\n", arr6, len(arr6))
|
|
|
|
// 不同类型的数组
|
|
fmt.Printf(" 不同类型的数组:\n")
|
|
boolArray := [3]bool{true, false, true}
|
|
floatArray := [4]float64{1.1, 2.2, 3.3, 4.4}
|
|
stringArray := [2]string{"hello", "world"}
|
|
|
|
fmt.Printf(" 布尔数组: %v\n", boolArray)
|
|
fmt.Printf(" 浮点数组: %v\n", floatArray)
|
|
fmt.Printf(" 字符串数组: %v\n", stringArray)
|
|
|
|
fmt.Println()
|
|
}
|
|
|
|
// demonstrateArrayOperations 演示数组的操作
|
|
func demonstrateArrayOperations() {
|
|
fmt.Println("3. 数组的操作:")
|
|
|
|
// 数组遍历
|
|
fmt.Printf(" 数组遍历:\n")
|
|
fruits := [4]string{"apple", "banana", "cherry", "date"}
|
|
|
|
// 使用索引遍历
|
|
fmt.Printf(" 使用索引遍历:\n")
|
|
for i := 0; i < len(fruits); i++ {
|
|
fmt.Printf(" fruits[%d] = %s\n", i, fruits[i])
|
|
}
|
|
|
|
// 使用 range 遍历
|
|
fmt.Printf(" 使用 range 遍历:\n")
|
|
for index, value := range fruits {
|
|
fmt.Printf(" fruits[%d] = %s\n", index, value)
|
|
}
|
|
|
|
// 只要值,忽略索引
|
|
fmt.Printf(" 只要值,忽略索引:\n")
|
|
for _, fruit := range fruits {
|
|
fmt.Printf(" 水果: %s\n", fruit)
|
|
}
|
|
|
|
// 只要索引,忽略值
|
|
fmt.Printf(" 只要索引,忽略值:\n")
|
|
for index := range fruits {
|
|
fmt.Printf(" 索引: %d\n", index)
|
|
}
|
|
|
|
// 数组修改
|
|
fmt.Printf(" 数组修改:\n")
|
|
numbers := [5]int{1, 2, 3, 4, 5}
|
|
fmt.Printf(" 原始数组: %v\n", numbers)
|
|
|
|
// 修改单个元素
|
|
numbers[2] = 99
|
|
fmt.Printf(" 修改索引2: %v\n", numbers)
|
|
|
|
// 批量修改
|
|
for i := range numbers {
|
|
numbers[i] *= 2
|
|
}
|
|
fmt.Printf(" 全部乘以2: %v\n", numbers)
|
|
|
|
// 数组查找
|
|
fmt.Printf(" 数组查找:\n")
|
|
target := "cherry"
|
|
found := false
|
|
foundIndex := -1
|
|
|
|
for i, fruit := range fruits {
|
|
if fruit == target {
|
|
found = true
|
|
foundIndex = i
|
|
break
|
|
}
|
|
}
|
|
|
|
if found {
|
|
fmt.Printf(" 找到 '%s' 在索引 %d\n", target, foundIndex)
|
|
} else {
|
|
fmt.Printf(" 未找到 '%s'\n", target)
|
|
}
|
|
|
|
fmt.Println()
|
|
} |