什么是数组?
数组是一组数
- 大小固定
- 数组内存放的数据类型一致
- 数组也是变量, 派生数据类型
package main
import "fmt"
// 数组赋值及初始化
func main() { // [size]type
// 定义的同时初始化 (可以写在一起)
var arr1 = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr1)
// 快速定义 :=
arr2 := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr2)
// 如果长度不确定 可以用 ... 来代表数组长度(Go 编译器会自动根据数据长度来对 ...进行赋值)
// 长度不是无限, 取决于数组元素个数
var arr3 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(len(arr3))
fmt.Println(arr3)
// 也可以给一些位置赋值 而其他的地方则是赋初始值
var arr4 [5]int
arr4 = [5]int{1: 2, 3: 6} // 这里就对 arr4[1] arr4[3] 进行赋值 其余都是赋初值0 (这个就基本数据类型而定)
fmt.Println(arr4) // [0 2 0 6 0]
}
遍历方式
package main
import "fmt"
func main() {
// 两种for循环方式可以用于遍历数组元素
// for i := 0; i < len(arr1); i++ & for i := range arr {}
var arr1 = [5]int{1, 20, 23, 24, 35}
for i := 0; i < len(arr1); i++ {
fmt.Println(arr1[i])
}
for index := range arr1 { // 如果只是接收一个值, 那么返回的是数组的下标, 可以通过arr[下标] 来访问元素
fmt.Printf("%d\t", index)
}
fmt.Println()
for index, value := range arr1 { // 接受两个值, 返回的是数组下标以及下标对应的值
fmt.Printf("index:%d,value:%d ", index, value)
}
}
数组类型
数组是值类型(值传递, 拷贝是新创一个内存空间), 所有复制后的对象 修改值后不会影响原来的值
数组的排序
- 升序(ASC): 从小到大进行排序 0-9, A-Z
- 降序(DESC): 从大到小进行排序 9-0, Z-A
排序算法: 冒泡排序, 选择排序, 快速排序, 希尔排序, 堆排序 ...
冒泡排序
package main
import "fmt"
// 使用冒泡排序 -> 升序/降序
func main() {
flag := false // 使用一个标志位来帮助判断是否排序已结束 (可以减少后期重复判断的次数)
var num1 = [5]int{12, 98, 321, 123, 21}
fmt.Println(num1) // 先输出数组的内容
for i := 1; i < len(num1); i++ { // 冒泡排序的基本实现
for j := 0; j < len(num1)-i; j++ { // 每次减少一次~
if num1[j] > num1[j+1] { // 若后面的元素比前面大那么就交换 (升序, 就是通过控制前后元素大小关系)
num1[j], num1[j+1] = num1[j+1], num1[j] // 交换两个数
flag = false // 还有变动 交换
} else {
flag = true
}
}
if flag { // 当flag 为 true 说明这一次循环没有变动了-> 数组已经有序~ 可以不用再排了 退出循环
break
}
fmt.Println(num1)
}
}
多维数组
- 一维数组: 线性的 一组数
- 二维数组: 类似于表格, 数组套数组
- 三维数组: 立体空间性的 (数组套娃)😂
- 多维数组: ... (类似的道理)
这里是二维数组的简单案例实用
package main
import "fmt"
// 遍历二维数组
func main() {
// 创建一个 三行四列的二维数组
var arr1 = [3][4]int{{1, 2, 3, 4},
{2, 3, 4, 5},
{3, 4, 5, 6},
}
// 遍历
for i := 0; i < len(arr1); i++ { // 取行数
for j := 0; j < len(arr1[i]); j++ { // 列数
fmt.Println(arr1[i][j]) // 打印出来~
}
}
fmt.Println("=============")
for _, v := range arr1 {
//fmt.Println(i, v) // 可以进一步循环 v(每行数据~)
for j := range v { // 遍历每行数据
fmt.Println(j)
}
}
}