前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 语言学习之数组

Go 语言学习之数组

作者头像
frank.
发布2020-07-28 15:07:11
3100
发布2020-07-28 15:07:11
举报
01

概念

数组是具有固定长度,并且有零个或多个相同数据类型元素的序列,数组长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同类型的数组,二者不可以比较,数组通过索引访问元素,Go 语言内置函数 len 可以返回数组的长度,在 Go 语言中,数组是值传递。

02

声明数组和初始化

在 Go 语言中,声明数组需要显式指定数组名称、数组长度和数组类型,默认情况下,未显示初始化一个新声明数组中的元素,数组初始值为元素类型的零值。在声明数组时,可以显式初始化数组的元素,并且可以指定索引位置和定义索引位置别名。其中,指定索引位置初始化数组元素,数组的长度为最大的索引位置数值加 1。通过代码,我们演示声明一个新数组的几种方式。

  • 声明数组,未初始化 func main() { var arr [3]int fmt.Println("arr 数组的第一个元素是:", arr[0]) fmt.Println("arr:", arr) }
  • 初始化数组元素 var arr2 = [4]int{1, 2, 3, 4} fmt.Println("arr2:", arr2)
  • 初始化数组元素,数组长度使用省略号 var arr3 = [...]int{1, 2, 3, 4, 5} fmt.Println("arr3 的长度:", len(arr3)) 初始化数组元素,数组长度使用省略号,数组的长度由初始化数组的元素个数决定。
  • 定义索引位置别名初始化数组元素 const ( name int = iota email ) var arr4 = [...]string{name: "lucy", email: "lucy@gmail.com"} fmt.Println(name, arr4[name]) fmt.Println("arr4:", arr4[0])
  • 指定索引位置初始化数组元素 var arr5 = [...]int{99: 100} fmt.Println(arr5[0], arr5[1], arr5[99]) 初始化数组元素,指定索引位置,数组的长度为最大索引数值加 1。
  • 声明多维数组 var arrS = [2][3]int{{1, 2, 3}, {10, 20, 30}} fmt.Println("二维数组 arrS:", arrS) var arrS2 = [...][2][3]int{ { {1, 2, 3}, {4, 5, 6}, }, { {11, 12, 13}, {14, 15, 16}, }, } fmt.Println("arrS2:", arrS2

声明多维数组,仅第一维度允许使用省略号。

03

数组比较

在 Go 语言中,数组支持比较,需要注意的是,数组的长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同的数据类型,不可以比较。在数组类型一致的前提下,数组之间才可以比较,并且只有数组的所有元素值全部相等,数组才相等。通过代码,我们演示数组比较的用法。

代码语言:javascript
复制
var arr6 = [5]int{1, 2, 3, 4, 5}
var arr7 = [...]int{1, 2, 3, 4, 5}
var arr8 = [5]int{2, 3, 4, 5, 6}
if arr6 == arr7 {
  fmt.Println("arr6 与 arr7 相等")
} else if arr6 == arr8 {
  fmt.Println("arr6 与 arr8 相等")
}

04

数组遍历

在 Go 语言中,除了使用 for 语句通过循环访问数组的索引,遍历数组元素之外,还可以使用 for...range 遍历数组,并且可以使用 “_” 忽略数组的索引。通过代码,我们演示使用 for...range 遍历数组。

代码语言:javascript
复制
var arr6 = [5]int{1, 2, 3, 4, 5}
for index, value := range arr6 {
  fmt.Printf("arr6[%d]=%d\n", index, value)
}

for _, value := range arr6 {
  fmt.Println("arr6=", value)
}

05

指针数组和数组指针

在 Go 语言中,指针数组是指数组的元素为指针类型的值,数组指针是指数组的内存地址。数组指针可以直接用来操作元素。通过代码,我们演示指针数组和数组指针的用法。

代码语言:javascript
复制
x, y := 1, 2
a := [2]*int{&x, &y}
p := &a
fmt.Println("数组的元素为指针类型的指针数组:", a)
fmt.Println("存储数组的内存地址的数组指针:", p)

06

数组是值传递

在 Go 语言中,数组是值传递,赋值和传参都会创建一个数组的副本,声明一个新数组,使用原数组赋值给新数组,修改原数组,新数组的元素值不改变,通过代码,我们演示数组是值传递。

代码语言:javascript
复制
var arr9 = [3]int{1, 2, 3}
var arr10 [3]int
arr10 = arr9
fmt.Println("arr9:", arr9)
fmt.Println("arr10:", arr10)
arr9[0] = 10
fmt.Println("arr9:", arr9)
fmt.Println("arr10:", arr10)

完整代码:

输出结果:

代码语言:javascript
复制
arr 数组的第一个元素是:0
arr: [0 0 0]
arr2: [1 2 3 4]
arr3 的长度:5
0 lucy
arr4: lucy
0 0 100
二维数组 arrS: [[1 2 3] [10 20 30]]
arrS2: [[[1 2 3] [4 5 6]] [[11 12 13] [14 15 16]]]
arr6 与 arr7 相等
arr6[0]=1
arr6[1]=2
arr6[2]=3
arr6[3]=4
arr6[4]=5
arr6= 1
arr6= 2
arr6= 3
arr6= 4
arr6= 5
数组的元素为指针类型的指针数组:[0xc0000b4080 0xc0000b4088]
存储数组的内存地址的数组指针:&[0xc0000b4080 0xc0000b4088]
arr9: [1 2 3]
arr10: [1 2 3]
arr9: [10 2 3]
arr10: [1 2 3]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档