Go 数组

27 阅读2分钟

什么是数组?

数组是一组数

  • 大小固定
  • 数组内存放的数据类型一致
  • 数组也是变量, 派生数据类型
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)
		}
	}
}