### Golang学习笔记(四):array、slice、map #### 一、Array 数组 在 Go 语言中,数组是一种固定长度的数据结构,用于存储相同类型的数据元素。数组是值类型,这意味着当它们被赋值或作为参数传递时,会进行一次完整的复制。 ##### 1. 声明与赋值 **初始化** - **语法**: `var VarName[n]type` // n >= 0 - **示例**: - `var a[5]int` // [0 0 0 0 0] - `var c[2][3]int` // 二维数组 - `var b int = [5]int{1, 2, 3, 4, 5}` // 声明并初始化 - `a := [3]int{1, 2, 3}` - `b := [10]int{1, 2, 3}` // 只初始化前三个元素,其余为 0 - `c := [20]int{19: 1}` // 第 20 个元素初始化为 1,其余为 0 - `d := []int{4, 5, 6}` // 动态数组,长度自动计算 - `e := []int{0: 1, 1: 2, 19: 3}` // 动态数组,部分元素显式初始化 **二维数组** - **示例**: - `doubleArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}` - `easyArray := [2][4]int{{1, 2, 3, 4}, {1, 2, 3, 4}}` **多维数组** - **示例**: `var multiArray [][4]int` // 多维数组,第一维长度可推断 - **注意**: 第二维必须明确赋值。 **数组长度** - **获取长度**: `arrLength := len(arr)` - **注意**: 数组长度是数组类型的一部分,不可更改;因此 `[3]int` 和 `[4]int` 是两种不同的类型。 **赋值** - 数组赋值是值的复制,将数组作为参数传递给函数时,实际上是传递数组的副本而非其地址。 - 如果需要传递数组的地址,应使用切片(slice)。 ##### 2. 元素访问 - **循环遍历**: - `for i := 0; i < len(array); i++ { fmt.Println(i, array[i]) }` - `for i, v := range array { fmt.Println(i, v) }` **创建数组指针** - `p := new([10]int)` // 返回指向数组的指针 **指针与数组** - **指向数组的指针**: - `a := [100]int{}` - `var p *[100]int = &a` - **指针数组**: - `x, y := 1, 2` - `a := []*int{&x, &y}` #### 二、Slice 切片 切片是基于数组的一种数据结构,它提供了动态调整大小的能力。切片是一种引用类型,它包含一个指向底层数组的指针、长度和容量。 ##### 1. 声明与赋值 - **通过数组创建**: - `var myArray[10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}` - `var mySlice []int = myArray[:5]` - `a := [5]int{1, 2, 3, 4, 5}` - `b := a[2:4]` - `b := a[:4]` - `b := a[2:]` - **从数组或已有切片声明**: - `var ar [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}` - `var a, b []byte` - `a = ar[2:5]` - `b = ar[3:5]` - **直接创建**: - `myslice1 := make([]int, 5)` - `myslice2 := make([]int, 5, 10)` // 初始长度 5,预留 10 个元素的空间 - `myslice3 := []int{1, 2, 3, 4, 5}` ##### 2. 元素访问 - **循环遍历**: - `for i := 0; i < len(mySlice); i++ { fmt.Println(i, mySlice[i]) }` - `for i, v := range mySlice { fmt.Println(i, v) }` ##### 3. 其他操作 - **大小与容量**: - `len` 获取切片的长度 - `cap` 获取切片的最大容量 - **动态增减元素**: - `append` 向切片添加一个或多个元素 - `mySlice = append(mySlice, 1, 2, 3)` // 添加三个元素 - `mySlice = append(mySlice, mySlice2)` // 添加另一个切片 **注意事项**: - 使用 `append` 方法会改变切片引用的底层数组的内容。 #### 三、Map 映射 映射(map)是另一种关联数据结构,它允许您根据键(key)来存储和检索值(value)。映射中的键是唯一的。 ##### 1. 声明与赋值 - **声明**: - `var m map[string]int` - `m := make(map[string]int)` - **赋值**: - `m["key"] = "value"` ##### 2. 元素访问 - **获取值**: - `value, exists := m["key"]` - **删除键值对**: - `delete(m, "key")` ##### 3. 其他操作 - **迭代映射**: - `for key, value := range m { fmt.Println(key, value) }` **总结**: 数组、切片和映射是 Go 语言中非常重要的数据结构。数组提供了一种固定的集合存储方式,切片则支持动态调整大小,而映射则提供了基于键值对的数据存储方式。理解这些数据结构的特性和用法对于有效地编程至关重要。




























- 粉丝: 8
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- vcos_components_configs-智能车资源
- 基于机器学习技术解决网络安全问题的学习 Demo 实践
- lanqiaobei-蓝桥杯资源
- AAGUI-C语言资源
- 青梧商城B2B2C-C++资源
- mica-mqtt-Java资源
- SwiftyJSON-Swift资源
- matlab-Matlab资源
- 基于机器学习技术的 web 攻击检测系统构建
- breadbot-机器人开发资源
- Ruoyi-Android-App-Kotlin资源
- 学习用机器学习解决网络安全问题的Demo
- A2A-AI人工智能资源
- Flet框架实现的家庭记账本示例自定义模板
- web-rwkv-Rust资源
- workerman-硬件开发资源


