细说Go语言数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类型例如整形、字符串或者自定义类型(结构体、接口)。数组长度必须是一个常量表达式,并且必须是一个非负整数,数组下标是从0开始的,并且数组的长度是固定不可变的,数组中元素的地址是连续的。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。

在其它编程语言中,数组一般都是引用类型,而在Go语言中,数组属于值类型。

注意:如果我们想让数组元素类型为任意类型的话可以使用空接口作为类型。当使用值时我们必须先做一个类型判断。

声明数组

Go语言数组声明需要指定元素类型及元素个数,语法格式如下:

// 变量名 [大小]类型 var variable_name [len]variable_type

示例:

定义一个长度为5的数组arr

var arr [5]int

以上我们声明了一个数组arr,但是我们还没有对他进行初始化,但是声明的变量都会有默认值,int类型的变量默认值是0,所以arr数组中的每个元素的值都是0。

数组在内存的结构

假如我们声明一个长度为5的数组var arr [5]int,我们来看看这个数组在内存中的结构是怎么样的。

细说Go语言数组

上图就是一个Go语言数组在内存的结构,在这个arr数组中,由于我们声明的是int32类型,所以数组中的每个元素在内存中占用的字节数是32/8=4字节,通过arr数组每个元素16进制地址我们可以发现,数组中后一个元素的地址比前一个元素的地址大4个字节,这个4字节正好是int32类型元素占用的内存大小,由此我们也能得出结论:数组中元素的内存地址是连续的;当声明数组时所有的元素都会被自动初始化为数组类型的默认值(int类型的默认值是0,所以arr中每个元素的默认值都是0);数组的下标识从0开始的。数组arr的地址就是数组第一个元素(下标为0的元素)的地址,通过下图打印arr的地址和arr[0]的地址就可以证明

细说Go语言数组

初始化数组

刚刚声明的数组已经被默认的元素类型零值初始化了,如果我们再次进行初始化怎么做呢,可以采用如下办法:

var arr [5]int arr = [5]int{1, 2, 3, 4, 5}

Go语言提供了声明加初始化的:=操作符,以让我们在创建数组的时候直接初始化。

arr := [5]int{1, 2, 3, 4, 5}

这种简短变量声明的方式不仅适用于数组,还适用于任何数据类型,这也是Go语言中常用的方式。

我们也可以在定义数组是不明确指定长度,让编译器自动推导出长度,可以使用...来替代具体的长度

arr := [...]int{1, 2, 3, 4, 5}

如果我们只想给数组的部分元素指定值,其他元素采用默认值我们可以采用下面的办法

arr := [5]int{0:3, 4:6}

这种方式表示我们只给数组下标为0的元素赋值为3,下标为4的元素赋值为6,其它元素的值依然是该类型的默认值(int的默认值是0)。

使用数组

数组元素的访问非常简单,通过索引(下标)即可访问数组的元素。

arr := [5]int{1, 2, 3, 4, 5} fmt.Println(arr[0], arr[1], arr[2], arr[3], arr[4])

修改数组的某个元素也很简单:

arr := [5]int{1, 2, 3, 4, 5} fmt.Println(arr[0]) arr[0] = 66 fmt.Println(arr[0])

如果我们要循环打印数组中的所有值,一个传统的就是常用的for循环:

for i := 0; i < len(arr); i++ { fmt.Println(arr[i]) }

不过大部分时候,我们都是使用for rang循环:

for i, v := range arr { fmt.Println("索引是:", i, "值是:", v) }

同样类型的数组是可以相互赋值的,不同类型的不行,会编译错误。那么什么是同样类型的数组呢?Go语言规定,必须是长度一样,并且每个元素的类型也一样的数组,才是同样类型的数组。

arr := [5]int{1, 2, 3, 4, 5} var arr2 [5]int = arr //可以 var arr3 [3]int = arr //不可以

指针数组和数组本身差不多,只不过元素类型是指针。

arr := [5]*int{1: new(int), 3:new(int)}

这样就创建了一个指针数组,并且为索引1和3都创建了内存空间,其他索引是指针的零值nil,这时候我们要修改指针变量的值也很简单,如下即可:

array := [5]*int{1: new(int), 3:new(int)} *array[1] = 1

以上需要注意的是,只可以给索引1和3赋值,因为只有它们分配了内存,才可以赋值,如果我们给索引0赋值,运行的时候,会提示无效内存或者是一个nil指针引用。

panic: runtime error: invalid memory address or nil pointer dereference

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspjxs.html