什么是数组
golang提供了数组类型的数据结构。数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型,例如(整形,字符串或者自定义类型)。
数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为0,第二个索引为1,以此类推。(数组以 0 开始在所有类 C 语言中是相似的)数组的下标取值范围是从0开始的,到长度减1
数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。
数组一旦定义后,大小不能更改(编译时需要知道数组长度以便分配内存)。
总结:
- 数组是长度固定的数据类型
- 数据元素的类型相同
- 数组是从0开始的,一直到长度减1为结束
- 数组长度是一个常量表达式,并且是一个非负整数
作用及应用场景
作用:
应用场景:
数组的定义和语法
一维数组的定义方式
初始化自定义
var arr [10] int
arr[0] = 100
arr[2] = 200
fmt.Println(arr) // [100, 0, 200, 0, 0, 0, 0, 0, 0, 0]
初始赋值定义法
var arr [2] int = [2] int {1, 2}
for i := 0; i < len(arr); i++ {
fmt.Println(i, arr[i])
}
var arr[2] int = [2]int{ 1, 2 }
不用定义长度,简略赋值法
package main
import "fmt"
func main() {
arr := [...]int{1, 2, 3, 4, 5}
fmt.Println(arr)
}
注意,简略赋值,不需要用var或者const声明
二维数组
package main
import "fmt"
func main() {
var arr1 [2][3]int
fmt.Println(arr1) // [[0 0 0] [0 0 0]]
arr2 := [2][3]int{{1, 2, 4}, {3, 4, 3}}
fmt.Println(arr2) // [[1 2 4] [3 4 3]]
arr3 := [4][3]int{1: {1, 1, 1}, 2: {2, 2, 2}}
fmt.Println(arr3) // [[0 0 0] [1 1 1] [2 2 2] [0 0 0]]
}
:=type [2][3]int is not an expression[2][3]int
多维度,多个数组
初始定义
package main
import "fmt"
func main() {
var arr [4][3][2]int = [4][3][2]int{}
fmt.Println(arr)
// [[[0 0] [0 0] [0 0]] [[0 0] [0 0] [0 0]] [[0 0] [0 0] [0 0]] [[0 0] [0 0] [0 0]]]
}
示例:
package main
import "fmt"
func main() {
/*
一维数组:存储的多个数据是数值本身
a1 :=[3]int{1,2,3}
二维数组:存储的是一维的一维
a2 := [3][4]int{{},{},{}}
该二维数组的长度,就是3。
存储的元素是一维数组,一维数组的元素是数值,每个一维数组长度为4。
多维数组:。。。
*/
a2 := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
fmt.Println(a2)
fmt.Printf("二维数组的地址:%p\n", &a2)
fmt.Printf("二维数组的长度:%d\n", len(a2))
fmt.Printf("一维数组的长度:%d\n", len(a2[0]))
fmt.Println(a2[0][3]) // 4
fmt.Println(a2[1][2]) //7
fmt.Println(a2[2][1]) // 10
//遍历二维数组
for i:=0;i<len(a2);i++{
for j:=0;j<len(a2[i]);j++{
fmt.Print(a2[i][j],"\t")
}
fmt.Println()
}
fmt.Println("---------------------")
//for range 遍历二维数组
for key1,val1 := range a2{
for key2,val2 := range arr{
fmt.Print(val2,"\t")
}
fmt.Println()
}
}
其他类型的数组创建方式
var a [4] float32 // 等价于:var arr2 = [4]float32{}
fmt.Println(a) // [0 0 0 0]
var b = [5] string{"ruby", "王二狗", "rose"}
fmt.Println(b) // [ruby 王二狗 rose ]
var c = [5] int{'A', 'B', 'C', 'D', 'E'} // byte
fmt.Println(c) // [65 66 67 68 69]
d := [...] int{1,2,3,4,5}// 根据元素的个数,设置数组的大小
fmt.Println(d)//[1 2 3 4 5]
e := [5] int{4: 100} // [0 0 0 0 100]
fmt.Println(e)
f := [...] int{0: 1, 4: 1, 9: 1} // [1 0 0 0 1 0 0 0 0 1]
fmt.Println(f)
数组是值类型
golang中的数组是值类型,而不是引用类型。这意味着当它们被分配给一个新变量时,将把原始数组的副本分配给新变量,如果对新变量进行了更改,则不会在原始数组中反映
package main
import "fmt"
func main() {
a := [...]string{"a", "b", "c"}
b := a
b[0] = "小阿肥"
fmt.Println("a is: ", a)
fmt.Println("b is: ", b)
}
数组的排序
数组的排序,就是让一个数组中的数据,根据一定的算法,最终是数值有顺序的,可以从小到大(升序),也可以从大到小(降序)。默认是升序。
排序算法也有很多种,冒泡排序,选择排序,插入排序,希尔排序,快速排序,堆排序等等。
倒序
arr := [5]int{15, 23, 8, 10, 7}
for i := 0; i < len(arr) - 1; i++ {
if(arr[i] < arr[i + 1]) {
t := arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = t
}
}
fmt.Println(arr)
数组的注意事项
- 数组是值类型
- len()获取长度
- 数组的长度是数组类型的组成部分
- 数组在内存当中是连续的存储空间
- 数组做为参数以引用形式传递函数,意义重大,当传递较大的数组时可以有效的提升cpu执行效率
- 数组做为值类型来传递函数,调用时是值拷贝,如果较大的数组传递对cpu的效能消耗是极其大的
最后
EntrepreneurialG