当前位置: 首页 > news >正文

GO 语言学习 之 数组和切片

预告 : 切片主要有学习两种用法和应用示例

这里重点是切片,数组的化其实我们可能用到的不会太多,切片本质上是一个边长数组,所以这个应用比较防范,因为大多数情况下,我们都不能确定数组的长度,所以使用切片相对容易轻松了许多。

数组

定义:

var variable_name [SIZE]data_type

其中,variable_name 是数组的名称,SIZE是数组的大小,data_type是数组中元素的数据类型

  • 数组长度必须是常量,且是类型的组成部分,一旦创建,大小不可变。
  • 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
  • 数组通过索引进行访问,从0到 len() - 1,超出范围会触发 painc
  • 数组是值类型,赋值和传参会传递一个一摸一样的副本,而不是指针,所以对副本的修改不会传递到原值
  • 数组支持多维数组

常见用法:

创建数组:

package mainimport "fmt"func main() {var a1 [5]int  // 声明一个包含 5 个整数的数组var a2 = [3]int{1, 2, 3}  // 初始化一个包含 3 个整数的数组a3 := [...]int{1, 2, 3, 4, 5}  // 根据元素数量自动推导出数组长度fmt.Println(a1)fmt.Println(a2)fmt.Println(a3)
}

数组的常见操作:

package mainimport "fmt"func print_array(array [5]int) {for i := 0;i < len(array);i++ {fmt.Println("print_array 输出数组元素 ", i, " 值为 ", array[i])}
}func main() {var a1 = [5]int {1,2,3,4,5}// 数组的长度fmt.Println("数组 a1 的长度 ", len(a1))// 遍历数组for i := 0;i < len(a1);i++ {fmt.Println("数组元素 ", i, " 值为 ", a1[i])}// 修改数组的内容a1[2] = 20fmt.Println("修改后数组的内容 : ", a1)// 函数实参print_array(a1)
}

切片

        切片的本质是一个结果体类型,他管理某一个数组类型,所以也算是引用类型。切片在作为参数或者赋值语句中,相当于值拷贝,结果是两个变量指向同一个数组。接着上面说,当遇到修改切片内容的时候,可能会触发扩容,一旦其中一个触发扩容后,这俩变量就不一样啦。切片作为一个变长数组使用,应该很容易理解了。

定义:

var variable_name []data_type

其中,variable_name 是数组的名称,[] 是类型的一部分不能省略,data_type是数组中元素的数据类型

切片是数组的引用,它并不存储数据,而是指向数组中的一个部分。

切片包含三个主要的部分:

  • 指针:指向数组中切片的第一个元素。

  • 长度:切片的元素个数。

  • 容量:切片所能容纳的最大元素数量,它是从切片的起始位置到数组末尾的元素数量。

切片的遍历和访问操作与数组相同,只是多了一个 cap(), 是数组的实际容量
切片的 零值 为 nil 

常见用法:

创建切片:

创建切片有三种方式:

  • 使用 []Type{} 直接创建切片
  • 使用 make 创建切片
  • 使用数组的切片操作创建切片
package mainimport "fmt"func main() {var a []intb := []int {1,2,3}c := make([]int, 3, 8)d := b[:2]e := b[0:]f := b[1:2]fmt.Println(a)fmt.Println(b)fmt.Println(c)fmt.Println(d)fmt.Println(e)fmt.Println(f)
}


s4 := make([]int, 0, 5)
s4 = append(s4, 1, 2, ...)
s4 = append(s4, s3...)

切片的常见操作:

  • 访问切片元素:
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println(a[0], a[1], a[4])
}
  • 切片的修改
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("修改之前:", a)a[3] = 10fmt.Println("修改之后", a)
}
  • 向切片添加元素
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("修改之前:", a)a = append(a, 6)fmt.Println("添加一个元素:", a)
}
  • 拷贝切片
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}b := make([]int, len(a))copy(b, a)  // 将 a 拷贝到 bfmt.Println("a 切片的内容:", a)fmt.Println("b 切片的内容:", b)
}
  • 切片的扩容
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("a的长度 ", len(a), "a的容量 ", cap(a), "扩容之前的内容:", a)a = append(a, 6,7,8,9,10)fmt.Println("a的长度 ", len(a), "a的容量 ", cap(a), "扩容之后的内容:", a)
}
  • 遍历切片
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}for i := 0; i < len(a); i++ {fmt.Println("第 ", i, "个元素:", a[i])}
}

相关文章:

  • 无人机用shell远程登录机载电脑,每次需要环境配置原因
  • 现代 JavaScript (ES6+) 入门到实战(六):异步的终极形态 - async/await 的优雅魔法
  • Redis分布式锁深度解析:从原理到实践
  • C++迭代器解析:正向、反向与随机访问迭代器
  • 【C++ 基础】 C++ 与 C 语言差异面试题(附大厂真题解析)
  • 【系统分析师】高分论文:论软件的系统测试及其应用
  • 4_Flink CEP
  • 深度解读概率与证据权重 -Probability and the Weighing of Evidence
  • 学习记录:DAY35
  • 循环神经网络的概念和案例
  • WebRTC(十三):信令服务器
  • #Redis分布式缓存# ——1.Redis持久化
  • 【Docker基础】Docker容器管理:docker events及其参数详解
  • 06_注意力机制
  • 通过交互式可视化探索波动方程-AI云计算数值分析和代码验证
  • LRU缓存设计与实现详解
  • 什么是MPC(多方安全计算,Multi-Party Computation)
  • word换行居中以后 前面的下划线不显示
  • Python商务数据分析——CHAPTER4-Pandas 数据分析全攻略
  • Qt事件系统