Golang学习笔记-05数组

数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。

1
2
// 定义一个长度为3元素类型为int的数组a
var a [3]int

数组定义

声明需要指明数组的大小和存储的数据类型。如果忽略 [ ] 中的数字不设置数组大小,Go 语言会根据数组初始化时元素的个数来设置数组的大小。

1
var 数组变量名 [元素数量]T

比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。

注意:[5]int[10]int是不同的类型。

1
2
3
var a [3]int
var b [4]int
a = b //不可以这样做,因为此时a和b是不同的类型

数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。

数组初始化

数组可以在声明数组的时候初始化,如果声明时没有手动初始化,那么编译器将自动初始化该数组,值为数组数据类型类型的零值

1
var arr [4] float32 // 等价于:var arr = [4]float32{}

初始化列表

使用初始化列表来设置数组元素的值。注意:初始化数组中 { } 中的元素个数不能大于 [ ] 中的数字。

1
2
3
var array1= [3]int{}                        //数组会初始化为int类型的零值
var array2 = [3]int{1, 2} //使用指定的初始值完成初始化, 未指定到的默认为零值
var array3 = [3]string{"北京", "上海", "深圳"} //使用指定的初始值完成初始化

忽略数组长度

如果忽略 [ ] 中的数组的长度并用 ... 代替,Go 语言编译器会为你自动推导数组的长度

1
2
3
//例
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
var cityArray = [...]string{"北京", "上海", "深圳"}

指定索引值

我们还可以使用指定索引值的方式来初始化数组,未指定的元素将会被初始化为零值,注意:索引是从0开始的,如:

1
2
var array = [5] int{4: 100} // [0 0 0 0 100]
var array = [...] int{0: 1, 4: 1, 9: 1} // [1 0 0 0 1 0 0 0 0 1]

数组的语法

访问数组元素

和其他语言一样,go语言中的数组可以通过其下标来访问对应的元素

1
2
var array = [3]string{"北京", "上海", "深圳"}
fmt.Println(array[2]) //输出 深圳

数组的长度

Go语言获取数组的长度语法和C语言类似,是通过将数组作为参数传递给len函数,可以获得数组的长度。

1
len(array)

数组的遍历

遍历数组a有以下两种方法:

for循环遍历
1
2
3
4
var a = [...]string{"北京", "上海", "深圳"}
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
for range遍历
1
2
3
4
var a = [...]string{"北京", "上海", "深圳"}
for index, value := range a {
fmt.Println(index, value)
}

如果只需要值并希望忽略索引,那么可以通过使用_ 标识符替换索引来实现这一点,否则你必须使用索引index,如果不适用编译器将会报错。[因为go语言规定变量声明后必须使用]

多维数组

Go语言支持多维数组(数组中又嵌套数组)。

多维数组的声明

1
var 数组名 [第一层大小][第二层大小]...[第N层大小] 数据类型

二维数组的声明和初始化,更高维度类似

1
2
3
4
5
6
7
8
9
func main() {
a := [3][2]string{
{"北京", "上海"},
{"广州", "深圳"},
{"成都", "重庆"},
}
fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]
fmt.Println(a[2][1]) //支持索引取值,输出 重庆
}

二维数组的遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
a := [3][2]string{
{"北京", "上海"},
{"广州", "深圳"},
{"成都", "重庆"},
}
for _, v1 := range a {
for _, v2 := range v1 {
fmt.Printf("%s\t", v2)
}
fmt.Println()
}
}

注意: 多维数组只有第一层可以使用...或 [ ] 来让编译器推导数组长度

数组是值类型

数组是值类型,复制和传参是值传递,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。

什么是值传递

1
2
3
4
5
num := 10
num2:=num
fmt.Println("num:",num,",num2:",num2)
num=20
fmt.Println("num:",num,",num2:",num2)

num2:=num时,是将num的值复制一份传递给num2,这就是值传递

其他

  1. 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的(数组声明的时候就已经分配了内存)。
  2. [n]*T表示指针数组,*[n]T表示数组指针 。
文章作者: Oxywen
文章链接: https://oxywen.cn/post/go/6/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不闻星河须臾